C# Unity2D中的生命实现

C# Unity2D中的生命实现,c#,unity3d,C#,Unity3d,几个月前,我开始了Unity2D开发的长途跋涉,所以我对UnityEngine的所有术语还是相当陌生的。在我的游戏中,我决定使用“生命”。我写下了(在我看来)应该起作用的脚本,但每次玩家死亡而不是减少生命计数器并在场景中重新启动它时,它会立即加载场景1(即GameOver屏幕)。我在本页上的逻辑是否不正确,或者是否有比玩家参考更好的方法来处理生命?(另外:值得一提的是,在播放器脚本中,生命被实例化/发送到playerprefs,我不认为我需要在这里包括这个) 这是我的destroyer obje

几个月前,我开始了Unity2D开发的长途跋涉,所以我对UnityEngine的所有术语还是相当陌生的。在我的游戏中,我决定使用“生命”。我写下了(在我看来)应该起作用的脚本,但每次玩家死亡而不是减少生命计数器并在场景中重新启动它时,它会立即加载场景1(即GameOver屏幕)。我在本页上的逻辑是否不正确,或者是否有比玩家参考更好的方法来处理生命?(另外:值得一提的是,在播放器脚本中,生命被实例化/发送到playerprefs,我不认为我需要在这里包括这个)

这是我的destroyer objects脚本中解释“死亡”的主要代码块:

public static int lives;

void Start()
{
    lives = PlayerPrefs.GetInt("lives");
}

void OnTriggerEnter2D(Collider2D other)
{
    //If the trigger happens to be tagged as a 'Player', does this.
    if (other.tag == "Player")
    {
        lives--;
        if (lives < 0)
        {
            PlayerPrefs.DeleteAll();
            SceneManager.LoadScene(1);
        } else
        {
            SceneManager.LoadScene(0);
            PlayerPrefs.SetInt("lives", lives);
        }

    }

    if (other.gameObject.transform.parent)
    {
        Destroy(other.gameObject.transform.parent.gameObject);
    } 
    else {
        Destroy(other.gameObject);
    }
}
公共静态int生命;
void Start()
{
lives=PlayerPrefs.GetInt(“lives”);
}
无效OnTiggerEnter2D(碰撞的R2D其他)
{
//如果触发器碰巧被标记为“玩家”,则执行此操作。
如果(other.tag==“玩家”)
{
生命--;
如果(寿命<0)
{
PlayerPrefs.DeleteAll();
场景管理器。加载场景(1);
}否则
{
场景管理器。加载场景(0);
PlayerPrefs.SetInt(“生活”,生活);
}
}
if(other.gameObject.transform.parent)
{
销毁(other.gameObject.transform.parent.gameObject);
} 
否则{
销毁(其他游戏对象);
}
}

正如我在评论中提到的,我认为您忘记了从Inspector中切换
isTrigger
字段,该字段位于
Collider
区域下

可能您认为您正在使用OnCollisionCenter。另外,如果您检查
OnTriggerEnter
OnCollisionEnter
之间的差异,这将非常有用。

正如我在评论中提到的,我认为您忘记了从Inspector中切换
isTrigger
字段,该字段位于
Collider
区域下


可能您认为您正在使用OnCollisionCenter。此外,如果您检查
OnTriggerEnter
OnCollisionEnter
之间的差异,这将非常有帮助。

As@Ugur Tufekci回答,但请确保添加BoxCollider2d而不是BoxCollider。简单的BoxCollider是
3d
,但您检测到
OnTriggerInter2D
,这意味着必须添加2d BoxCollider

,正如@Ugur Tufekci回答的那样,但是请确保添加BoxCollider2d而不是BoxCollider。简单的BoxCollider是
3d
,但是您检测到
OnTiggerInter2D
,这意味着必须添加2d BoxCollider

其他信息:在播放器脚本中,生命最初设置为3。您的逻辑似乎是正确的。似乎未正确设置
lives
的初始值,或者,由于从
PlayerPrefs
加载,该值可能被覆盖。在递减(使用
Debug.Log
或使用调试器)之前,请尝试检查
lifes
的实际值。逻辑似乎正确,但我认为您忘记了从碰撞器区域下方的Inspector中切换触发器字段。您应该单击以显示触发器字段,因为您正在使用OnTiggerEnter。如果您检查OnTiggerEnter和OnCollisionInter之间的差异,这将非常好。其他信息:在播放器脚本中,生命最初设置为3。您的逻辑在这里似乎是正确的。似乎未正确设置
lives
的初始值,或者,由于从
PlayerPrefs
加载,该值可能被覆盖。在递减(使用
Debug.Log
或使用调试器)之前,请尝试检查
lifes
的实际值。逻辑似乎正确,但我认为您忘记了从碰撞器区域下方的Inspector中切换触发器字段。您应该单击以显示触发器字段,因为您正在使用OnTiggerEnter。如果你检查一下OnTiggerEnter和OnCollisionEnter之间的区别,那就太好了。是的,我打开了屏幕截图的场景,我忘了他正在处理2d对象,但我想他知道区别:)是的!。您应该清除
触发器
碰撞器
之间的差异。是的,我打开了屏幕截图的场景,我忘记了他正在处理2d对象,但我想他知道区别:)是的!。您应该清除
触发器
碰撞器
之间的差异。我的问题实际上是在播放器控制器脚本中;我向playerprefs发送初始生命计数器的行不正确。我已经把它作为一个触发器了。但是,我选择这个作为答案,因为在修复它之后,OnTriggerEnter2D函数使其达到生命多次减少的位置,所以我需要更多地研究这些差异。非常感谢!我的问题实际上是在播放器控制器脚本中;我向playerprefs发送初始生命计数器的行不正确。我已经把它作为一个触发器了。但是,我选择这个作为答案,因为在修复它之后,OnTriggerEnter2D函数使其达到生命多次减少的位置,所以我需要更多地研究这些差异。非常感谢!