Unity3d 当玩家落水时,UNITY将失去一条生命

Unity3d 当玩家落水时,UNITY将失去一条生命,unity3d,collision-detection,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.B

我想改变玩家每次落水时的生命数量。到目前为止,我编写了以下代码:

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次,直到他回到原来的位置(重生位置)


有人能帮我吗?

首先想到的是:

  • 在你的水上
    游戏对象
    ,添加一个
    碰撞器
    组件。我认为
    BoxCollider
    适合这种情况。不要忘记标记
    是触发器
    复选框
  • 在玩家
    游戏对象
    上,添加
    刚体
    角色控制器
    (因为看起来您正在使用
    角色控制器
    组件)。确保选中
    刚体
    为运动学
    复选框。另外,给你的
    GameObject
    一个有意义的标签,比如“Player”
  • 回到水
    游戏对象
    ,添加一个新脚本,该脚本应如下所示:

    public class Water : MonoBehaviour {
        void OnTriggerEnter(Collider collider) {
            if(collider.CompareTag("Player")) {
                collider.SendMessage("Kill");
            }
        }
    }
    
    public class Player : MonoBehaviour {
        public void Kill() {
            //Perform all necessary steps to kill the player such as...
            //Reduce the amount of lives by 1
            //Play the death sound
            //etc. etc. etc.
        }
    }
    
  • 回到玩家
    GameObject
    ,添加一个新脚本,该脚本应如下所示:

    public class Water : MonoBehaviour {
        void OnTriggerEnter(Collider collider) {
            if(collider.CompareTag("Player")) {
                collider.SendMessage("Kill");
            }
        }
    }
    
    public class Player : MonoBehaviour {
        public void Kill() {
            //Perform all necessary steps to kill the player such as...
            //Reduce the amount of lives by 1
            //Play the death sound
            //etc. etc. etc.
        }
    }
    

  • 这就是事情的“jist”,或者这至少应该让你开始。Unity有一些非常好的文档,实际上您需要的任何东西都在那里,您只需要知道在哪里查找即可。我不打算深入讨论上面提到的每一件事,因为正如我所说的,“Unity有一些非常好的文档。”考虑到这一点,我强烈建议大家研究一下我提到的每一件事。希望这有帮助!=)

    你想知道什么?基本上我怎样才能防止?当玩家落水时,有没有办法只失去一条生命,而不是50或100条生命?当你第一次落水时,挂上一面旗子。仅在未设置标志的情况下扣减寿命。在你确定你不再只是重复地撞到水上之后,清除旗帜。或者,以某种方式重新编写代码,这样你就不会连续100次快速落水,也许可以暂时移除玩家(他确实死了,对吧?)。我如何设置旗帜?你是说一个变量吗?感谢您的帮助,将尝试itA标志也被称为布尔变量。所以,当你失去生命时,将布尔值设为true,然后检查该布尔值,如果为true,则不扣除生命。如果布尔值为false,则减去一个life。