【问题标题】:Unity C# variable not working inside OnCollisionEnterUnity C# 变量在 OnCollisionEnter 中不起作用
【发布时间】:2021-01-20 17:34:19
【问题描述】:

我正在开发一个游戏,它基本上是关于滚动球,当你击中游戏结束对象时它就是游戏结束,当你击中目标对象时它就是目标(也许你会被导航到下一阶段或其他什么),在这里我想要算法,当你击中目标对象后击中游戏结束对象时,它会被忽略,所以一旦你击中目标对象,你就会赢得舞台。

这里是C#代码,我设置变量goaled,当你击中目标对象时尝试将变量更改为“true”,只有当goaled == false,当你还没有进球时,你会输.但是代码不起作用,作为预期的结果,它不应该在我进球后记录“游戏结束”,但实际上它会。

那么,如何修改代码以按预期工作?谢谢。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class tmp03 : MonoBehaviour
{

    bool goaled = false;

    void OnCollisionEnter(Collision otherObj)
    {

        // bool goaled = false;

        if (gameObject.name == "goal" && otherObj.gameObject.name == "ball")
        {
            Debug.Log("goal");
            Debug.Log(goaled);
            goaled = true;
            Debug.Log(goaled);
        }
        if (gameObject.name == "gameover" && otherObj.gameObject.name == "ball" && goaled == false)
        {
            Debug.Log("gameover");
            Debug.Log(goaled);
        }

    }

}

【问题讨论】:

  • 如果您查看文档docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html,他们也会像您一样使用变量。我认为命名有问题。您是否尝试将目标设置为公开?这样你就可以在编辑器中跟踪比赛期间的变化,看看你进球是否会发生变化。调试日志返回的值是多少,是否成功更改了目标 var onCollisionEnter?
  • @Holger 是的,我也尝试过public bool goaled = false;,但没有成功。
  • 也许你忘记了刚体组件。为此,至少其中一个对象必须具有刚体组件。如果您不想添加刚体,我建议在目标和游戏结束对象的碰撞器上使用 onTriggerEnter 并将 isTrigger 属性切换为 true。
  • @MustafaCemKobal 我有用于“球”对象的刚体组件。 OnCollisionEnter 本身运行良好,当球物体击中物体时会显示日志。

标签: c# unity3d


【解决方案1】:

据我所知,从您的代码中,特别是从代码中 gameObject.name == "goal" && otherObj.gameObject.name == "ball"gameObject.name == "gameover" && otherObj.gameObject.name == "ball" && goaled == false,在我看来,您好像将此脚本添加到 goalgameover 游戏对象中。

这是两个不同的脚本实例。他们不会在他们之间共享goaled 属性。 如果您只想跟踪一个 goaled 属性,您应该只添加一次脚本(在这种情况下,添加到播放器)并反转 if 条件。将球作为主要游戏对象,将游戏结束对象和目标作为otherObj

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    相关资源
    最近更新 更多