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;}//每帧调用一次Updatevoid 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. 我的世界服务器怎么显示玩家血量,我的世界如何用boss血条显示玩家血量 | 手游网游页游攻略大全...

    发布时间:2015-12-29 孤岛惊魂原始杀戮不显示血条怎么办 怪物血量无敌BUG.孤岛惊魂原始杀戮游戏中有玩家遇到了BUG,怪物血条看不见,而且还打不死,该怎么办呢?下面99单机网小编给大家介绍孤 ...

  2. 2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给

    2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给 ...

  3. 项目实训--Unity多人游戏开发(十五、道具战)

    文章目录 emm关于聊天功能的闲话 道具战游戏简介 截图 游戏功能 关键代码 全局 悬浮物道具 实际道具 人物脚本 总结 emm关于聊天功能的闲话 聊天功能也是使用PhotonChat提供的API,比 ...

  4. ui动效 unity_【FairyGUI Unity】使用动效功能实现血条UI扣血与加血的缓动效果

    原理 血条使用进度条组件,可以得到当前值与最大值. 通过动效-改变缩放可以让图片宽度从1到0按百分比变化. 动效可以指定播放动效的时间范围 组件设计 创建一个进度条组件,作为血条. bar是实际血量条 ...

  5. rust倒地了怎么起来_绝地求生:如果红血时移速变慢,倒地时挪动加快掉血,将会如何?...

    作为时下最热门的网络游戏,<绝地求生>可以说是一时间席卷全球吸粉无数,不少喜欢玩吃鸡的小伙伴们都不禁感慨,这款游戏做得也太真实了吧!确实,我们不得不否认,从整体上或者细节上,<绝地求 ...

  6. 穿越火线好友服务器不稳定,穿越火线合区后新危机,玩家:卡顿掉帧没法玩

    原标题:穿越火线合区后新危机,玩家:卡顿掉帧没法玩 大家好我是小包子,今天和大家聊一下穿越火线经历了一次大规模的合区之后,玩家们顿时感受到了服务器真正的火热.服务器总数的减少使得很多地区的玩家们相聚一 ...

  7. (java版)删除重复值阿伟学长在开发一款游戏, 他希望玩家已经获得的道具会降低爆率, 避免玩家获得太多重复的道具但玩家背包中道具是乱序且不确定的, 为了减小判断的运算量, 需要先对数据进行去重.

    1. 删除重复值 阿伟学长在开发一款游戏, 他希望玩家已经获得的道具会降低爆率, 避免玩家获得太多重复的道具 但玩家背包中道具是乱序且不确定的, 为了减小判断的运算量, 需要先对数据进行去重. 设计一 ...

  8. Unity全局音量控制以及音量信息存储在本地

    Unity全局音量控制以及音量信息存储在本地 一个简单的全局音量控制功能,主要实现进入游戏音量同步以前的设置,点击设置弹出设置窗口,点击小喇叭禁用\开启音量,移动滑动条调节音量大小. 一.进入游戏时设 ...

  9. 详解Unity的移动控制实现

    前言 上一篇写了数种Unity中的移动方式,有物理移动,有非物理移动等,这篇我们来谈谈Unity中的移动控制方式,来结合上一篇所说的方法,用起来.一般控制是通过获取用户输入来处理角色移动逻辑的,而用户 ...

最新文章

  1. 富文本编辑器中空格转化为a_如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?...
  2. 排序算法:归并排序、快速排序
  3. liferay requestrequest和actionRequest用法
  4. Lighting System Design UVA 11400 (dp+思维)
  5. Linux安装net的工具,centos7安装netbox(不错开源网络管理工具) – 运维那些事
  6. 跟着别人的感觉做网络推广之二
  7. MySQL数据以全量和增量方式,向ES搜索引擎同步流程
  8. 箭头函数写法_初探ES6:箭头函数
  9. 网吧用电影服务器系统,网吧流媒体电影服务器搭建的解决方案
  10. 大型医院his系统源码 医院信息管理系统源码 C/S架构
  11. excel复制公式递增_快速向下复制Excel公式
  12. 拿中国互联网的两个航母说事(一)--腾讯战略
  13. 免费域名备案查询接口
  14. 第一章、linux入门及基本命令(案例讲解)
  15. C语言编程>第二十六周 ⑥ 请补充fun函数,该函数的功能是:按 “0”到 “9”统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。注意:不能使用字符串库函数。
  16. python做动态表情包下载_用 Python 开发一个【GIF表情包制作神器】
  17. 【SQL】练习题184道
  18. link2SD的原理以及开启方法
  19. vagrant springcloud java 镜像:制作详解(带下载地址)
  20. 美术教师观念、角色转变的途径

热门文章

  1. c++函数const
  2. MATLAB图像imshow函数显示问题、uint8与double类型转换、自定义图像显示函数
  3. ora-01722 无效数字_Oracle数据报ORA-01722: 无效数字错误解决方案的示例
  4. 【C语言】pow、sqrt函数的模拟实现
  5. ABC281G Farthest City
  6. 捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
  7. 基于mkCDrec的linux服务器数据库应用软件的备份与恢复
  8. JavaScript闭包和this
  9. 7_17_中科实训day03
  10. 怎么将flac格式的音乐转换为MP3格式