当前位置:   article > 正文

Unity-2D学习【BUG记录】角色血条与受击问题_3dunity 血条经验值没变化是什么原因

3dunity 血条经验值没变化是什么原因

需求:创建一个血条UI,在角色受击时扣血。

思路:创建画布,按顺序创建BaseUI>HP>TEXT,编写HP.cs,并且初始化当前值HealthCurrent和最大值(原始值)HealthMax两个变量,并且从PlayerController里取得角色原始值health变量进行赋值。

代码(HP.cs):

  1. ...
  2. // 初始化数显
  3. public Text healthText;
  4. // 定义静态变量当前血量
  5. public static int HealthCurrent;
  6. // 定义静态变量原始血量
  7. public static int HealthMax;
  8. private Image healthBar;
  9. // Start is called before the first frame update
  10. void Start()
  11. {
  12. healthBar = GetComponent<Image>();
  13. HealthCurrent = HealthMax;
  14. }
  15. // Update is called once per frame
  16. void Update()
  17. {
  18. healthBar.fillAmount = (float)HealthCurrent / (float)HealthMax;
  19. healthText.text = HealthCurrent.ToString() + "/" +HealthMax.ToString();
  20. }

代码(PlayerController.cs):

  1. ...
  2. // 定义角色血量
  3. public int health;
  4. // Start is called before the first frame update
  5. private void Start()
  6. {
  7. ...
  8. HealthUI.HealthMax = health;
  9. }
  10. ...

跑一下看看:

出现了一个BUG:运行之后HP没有进行初始化,或者说初始化失败,他没有显示满血状态 。

 挨打之后,恢复正常,代表Update函数运行成功,能够改变血量条的变化和比值。

我寻思这是一个逻辑问题,首先,血量UI应该时依附于player的,Player这个角色和脚本在游戏开始时就应该初始化完成,当他初始化完成后,血量UI以及其他附属组件就应该可以去拿player里的值和组件了,而现在通过运行得知player初始化完成并且把血量给到了HP的静态变量中,但可以说UI的Start可能和player的是同一时间进行初始化的(因为都是第一帧,姑且这么认为),在第一帧就完成了,所以UI初始化时,HealthCurrent = HealthMax;拿到的其实是默认值,int变量默认值为0,所以我点击运行时他显示0/100,当受击后,他才调用到了player给的值,恢复了正常。

暴力解决办法:把player的优先级提高,让他提前完成初始化,把值给Hp,然后hp再进行初始化,这样就能解决,将player里的Start改成Awake即可。

推荐解决办法:不改变代码,点击脚本文件,打开项目设置,点击脚本执行顺序,将需要按照顺序执行的脚本都拖入这个框里,他的值越小就越快执行。

方法1解释:unity是个单线程作业的,所谓协程是一个类似多线程的,但他其实还是单线程执行,unity 脚本自带函数执行顺序如下:
Awake>OnEable>Start>FixedUpdate>Update>LateUpdate>OnGUI>Reset>OnDisable>OnDestroy

方法2截图:

BUG已修复。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/866265
推荐阅读
相关标签
  

闽ICP备14008679号