草庐IT

unity玩家血量控制,定时掉血,道具加血

Min-篮球小菜鸡 2023-04-04 原文

unity玩家血量控制,定时掉血,道具加血

首先将玩家,加血道具,掉血道具添加进场景中

为玩家挂接碰撞体和刚体

而两种道具只需要挂接碰撞体

 

下面是玩家的挂接脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RubyController : MonoBehaviour
{
    //设置玩家无敌时间间隔
    public float timelnvincible = 2.0f;
    //设置是否无敌变量
    bool islnvincible;
    //定义变量,进行无敌时间的计时,无敌时间计时器
    float invincibleTimer;

    //设置最大生命值(生命上限)
    public int maxHealth = 5;
    //设置当前生命值的属性health
    //C#中支持面向对象程序设计中的封装概念,对数据成员的保护
    //数据成员变量,默认一般都应该设为私有,只能通过当前类的方法或属性进行访问
    //属性是公有的,可以通过取值器get、赋值器set设定对应字段的访问规则,满足规则才能够访问
    int currentHealth;
    public int health
    {
        get { return currentHealth; }
        //set {currentHealth=value;}
    }


    //为了防止角色发生抖动(若要防止角色发生旋转,需要将角色中的Rigidbody 2D组件中的Constraints中的Z轴锁定)
    //声明刚体对象
    Rigidbody2D rigidbody2D;

    //获取用户输入
    float horizontal;
    float vertical;

    //该方法以单位每秒来表示移动速度
    //将速度暴露出来,使其可调
    public float speed = 3.0f;

    private void Start()
    {
        //获取当前游戏对象的刚体组件
        rigidbody2D = GetComponent<Rigidbody2D>();
        //游戏开始前,玩家满血
        //初始化当前生命值
        currentHealth = maxHealth;
    }

    //每帧调用一次Update
    void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");

        //判断是否处于无敌状态,来进行计时器倒计时
        if(islnvincible){
            //如果无敌,进入倒计时
            //每次update减去一帧所消耗的时间
            invincibleTimer -= Time.deltaTime;
            if (invincibleTimer<0)
            {
                islnvincible = false;
            }
        }
        
    }
    //为了使物理计算保持稳定(只要牵扯物理引擎相关方法,都需要放到FixedUpdate函数中)
    //固定时间间隔执行的方法(不论硬件条件如何)
    private void FixedUpdate()
    {
        Vector2 position = rigidbody2D.position;
        position.x = position.x + speed * horizontal * Time.deltaTime;//Time.deltaTime表示帧所需要的时间
        //因为每台机器的帧数刷新不同,所以需要乘上各台电脑的每帧刷新的时长,这样就能确保各台电脑每次按下按键后的移动距离都相同
        position.y = position.y + speed * vertical * Time.deltaTime;
        rigidbody2D.MovePosition(position);
    }
    //更改生命值的方法
    public void ChangeHealth(int amount)
    {
        //假设玩家受伤害的时间间隔是2秒
        if (amount<0)//当玩家扣血时
        {
            //判断玩家当前是否处于无敌状态
            if (islnvincible)
            {
                return;//当玩家处于无敌状态时,return后面的所有函数内的语句都不执行,不掉血也不输出信息
            }
            islnvincible = true;
            invincibleTimer = timelnvincible;
        }

        //限制方法,限制当前生命值的赋值范围:0-最大生命值
        currentHealth = Mathf.Clamp(currentHealth+amount,0,maxHealth);//Mathf是一个静态类中的静态方法,不需要创建对象即可直接调用,Mathf是一个通用的数学函数
        //在控制台输出生命信息
        Debug.Log("当前生命值:"+currentHealth+"/"+maxHealth);
    }

    // Start is called before the first frame update
    //void Start()
    //{
    //    //只有将垂直同步设置成0,才能锁帧,否则锁帧的代码无效(但实际操作上设置为1同样也可锁帧)
    //    //垂直同步的作用就是显著减少游戏画面撕裂、跳帧,因为画面的渲染不是整个画面一同渲染的,而是逐行逐列渲染的
    //    QualitySettings.vSyncCount = 0;
    //    //设置应用程序帧数为10
    //    Application.targetFrameRate = 10;

    //}

    // Update is called once per frame
    //void Update()
    //{
    //    //获取水平输入,按向左,会获得-0.1f;按向右会获得1.0f
    //    float horizontal = Input.GetAxis("Horizontal");
    //    //获取垂直输入,按向下,会获得-0.1f;按向上会获得1.0f
    //    float vertical = Input.GetAxis("Vertical");
    //    //创建一个Vector2对象positon,用来获取当前对象的位置
    //    //Vector2是一个系统类,是C#中自带的一个类(Unity中的类),Vector2 position来描述2D的位置
    //    Vector2 position = transform.position;
    //    //更改position的x坐标值,让其加上0.1
    //    position.x = position.x + 0.1f*horizontal;
    //    position.y= position.y+ 0.1f*vertical;
    //    //更新当前对象的位置到新的位置
    //    transform.position = position;
    //}
}

在加血道具和减血物体中,由于碰撞需要,需要将碰撞体组件中的Is Trigger勾上,这样玩家不仅可以通过碰撞体触发事件,还能够不被道具影响行进路线

下面是加血道具挂接脚本

为了让加血道具只能够使用一次,当玩家并不满血,拾到加血道具时,加血道具会消失(被销毁)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HealthCollectible : MonoBehaviour
{
    //草莓加的血量
    public int amount = 1;
    //用来记录碰撞次数
    //int collideCount=0;
    //添加触发器碰撞事件,每次发生碰撞时,执行器中的代码
    private void OnTriggerEnter2D(Collider2D other)
    {
        //collideCount = collideCount + 1;
        //Debug.Log($"和当前物体发生碰撞的对象是:{other},当前是第{collideCount}次碰撞");
        
        //获取Ruby游戏对象的脚本组件对象
        RubyController rubyController = other.GetComponent<RubyController>();
        
        if (rubyController!=null)
        {
            //当获取到脚本组件对象的时候再执行下列代码,防止出现错误
            if (rubyController.health<rubyController.maxHealth)
            {
                //更改生命值
                rubyController.ChangeHealth(amount);
                //销毁当前游戏对象
                //可以让草莓被吃掉
                Destroy(gameObject);
            }
            else
            {
                Debug.Log("当前玩家满血,不需要加血");
            }
           
        }
        else
        {
            // 当未获取到对象时(出错了),则报出提示错误
            Debug.LogError("rubyController游戏组件并未获取到......");
        }
       
    }
}

减血道具与加血道具类似,将影响血量值改为负数即可

但与加血道具不同的一点是,若不控制每次减血的时间间隔(由于每次刷新都将响应减血),则在一秒内,所有血量都将清空。

所以我们需要设置一个控制器,来解决血量的瞬间减少的问题,该控制器设置在玩家的脚本身上(看上面的玩家脚本,都带有注释),实现的是,玩家走上地刺,每两秒钟间隔会扣一次血,捡到草莓时,草莓消失,玩家加血。

 

下面是减血道具的挂接脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DamageZone : MonoBehaviour
{
    public int damageNum = -1;//减少的血量
    private void OnTriggerStay2D(Collider2D other)
    {
        RubyController rubyController = other.GetComponent<RubyController>();
        if (rubyController!=null)//当获取对象不为空时再进行血量控制函数的调用
        {
            rubyController.ChangeHealth(damageNum);
        }
    }
}

如有疑问欢迎留言或私信

谢谢!

有关unity玩家血量控制,定时掉血,道具加血的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  7. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  8. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  9. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  10. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

随机推荐