UNITY当球员击中水时失去一条生命

时间:2013-04-04 22:08:51

标签: unity3d collision-detection

我希望每次玩家击中水时都能改变生命的数量。我到目前为止编写了这段代码:

public var dieSound:AudioClip;
static var lives = 3;

function Start () {

}

function Update () {
if(lives == 0)
{
Application.LoadLevel("menu");
}
}

public function OnGUI()
{
GUI.backgroundColor = Color.blue;
GUI.Button (Rect (10, 10, 100, 30), "Lives: " + lives);
}

function OnControllerColliderHit (hit : ControllerColliderHit)
{
if (hit.collider.tag == "Water")
{
// play dying sound
audio.PlayOneShot(dieSound);

// show mission fail UI
GameObject.Find("MissionTXT").guiText.enabled = true;
// wait until it's ended
yield WaitForSeconds(dieSound.length + 0.01);
transform.position = GameObject.FindWithTag("Respawn").transform.position;

if (transform.position == GameObject.FindWithTag("Respawn").transform.position)
{
GameObject.Find("MissionTXT").guiText.enabled = false;
lives = lives - 1;
}
}
}

问题是当玩家遇到水时,生命从3变为-120。我认为这是因为玩家在水面上停留了6-7秒。因此,角色可能会遇到水120次,直到他回到原来的位置(重生位置)。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

首先想到的是:

  1. 在您的水GameObject上添加Collider组件。我认为BoxCollider适合这种情况。不要忘记标记Is Trigger复选框。
  2. 在您的播放器GameObject上,添加RigidBodyCharacterController(因为看起来您正在使用CharacterController组件)。务必检查RigidBody的{​​{1}}复选框。另外,请为Is Kinematic提供一个有意义的标签,例如“播放器”。
  3. 回到水GameObject,添加一个看起来像这样的新脚本:

    GameObject
  4. 返回播放器public class Water : MonoBehaviour { void OnTriggerEnter(Collider collider) { if(collider.CompareTag("Player")) { collider.SendMessage("Kill"); } } } ,添加一个看起来像这样的新脚本:

    GameObject
  5. 这是事情的“主义”,或者至少应该让你开始。 Unity有一些非常好的文档,几乎你需要的任何东西都在那里,你只需要知道在哪里看。我不会深入研究上面提到的每一件事,因为正如我所说,“Unity有一些非常好的文档。”考虑到这一点,我强烈建议调查我提到的每一件事。希望这可以帮助! =)