【发布时间】:2019-08-01 14:58:42
【问题描述】:
我有一个游戏,玩家有 10 点生命值。每次他失去生命值时,他的心脏就会下降 0.5 。为了给玩家一些希望,我决定为敌人添加可掉落的心。这些心可以填充 2 点生命值。
问题是我制作的健康脚本是公共的 Int 健康。这不允许“、+、-”而且我不知道如何适应这一点。
我的健康脚本
[Header ("Max/Starting Health")]
public int maxHealth;
[Header ("Current Health")]
public int health;
void Start () {
health = maxHealth;
}
public bool TakeHeal (int amount) {
if (dead || health == maxHealth)
return false;
health = Mathf.Min (maxHealth, health + amount);
if (OnTakeHealEvent != null)
OnTakeHealEvent.Invoke();
return true;
}
HealthPickup 脚本
using UnityEngine;
public class HealthBoost : MonoBehaviour
{
Health health;
public float healthBonus = 2;
void Awake()
{
health = FindObjectOfType<Health>();
}
void OnTriggerEnter2D(Collider2D col)
{
if(health < health.maxHealth)
{
Destroy(gameObject);
health = health + healthBonus;
}
}
}
我正在考虑将 healthpickup 脚本更适合于治疗。但我不知道如何使它与游戏对象发生碰撞
【问题讨论】:
-
你在添加生命值之前就已经破坏了拾取的游戏对象。之后就销毁它。
-
@MateusFernandes 仅供参考,除非您使用
DestroyImmediate(),否则游戏对象的销毁不会立即发生 -
@Iggy 没错,但最好在标记要销毁的对象之前添加健康状况,因为我们几乎无法控制垃圾收集器何时运行。还要注意,如果我们在脚本中销毁对象,函数仍然会完成。
-
@Eddge 当然,我也更喜欢把它放在最后。但是保持在这与GC无关。 Docs: "实际的对象销毁总是延迟到当前更新循环之后,但总是在渲染之前完成。"
-
@Iggy 啊,但是触发器不在更新循环中,它发生在物理循环中。这发生在更新循环之前,所以这可能意味着以相反的顺序执行可能是安全的,但正如你所说,我喜欢另一种方式,不喜欢诱惑命运 =)。
标签: c# unity3d game-physics