我正在Unity中建立一个Doodle Jump副本,以自学基础知识,并且遇到了问题。该游戏的流程为:

主菜单---(单击开始)->级别选择---(单击级别)->选定级别

播放器控制的对象实际上是在主菜单屏幕中创建的。从一开始就可以控制它,而GameObject.DontDestroyOnLoad()可以阻止它在每个场景过渡期间被破坏。进入选定的关卡后,相机会附加一个脚本,以使其随角色一起移动。

我在LateUpdate方法中有一些代码可以处理摄像机的运动:

void LateUpdate () {

    if (gameObject.transform.position.y > transform.position.y) {

        Vector3 newPosition = new Vector3(transform.position.x, gameObject.transform.position.y, transform.position.z);
        transform.position = Vector3.SmoothDamp(transform.position, newPosition, ref currentVelocity, smoothSpeed * Time.deltaTime);

    }

}


但是要使其正常工作,我需要能够引用玩家(上面代码中的gameObject)。我最初是通过使用

GameObject gameObject = GameObject.Find("Doodler");


在相同的LateUpdate方法中,但我没有理由在每一帧都找到Doodler,因为在您玩完游戏之前,不应该替换它。因此,我将GameObject.Find行移到了Start方法中,但是它似乎没有找到Doodler,因此相机没有移动。有人可以帮忙吗?

编辑:

我现在将Start方法更改为如下所示:

private GameObject gameObject;

void Start() {
    gameObject = GameObject.Find("Doodler");
    Debug.Log("START Found the Doodler: " + gameObject.GetInstanceID());
}


而不是这样:

void Start() {
    GameObject gameObject = GameObject.Find("Doodler");
    Debug.Log("START Found the Doodler: " + gameObject.GetInstanceID());
}


这似乎正在工作。我猜第二种方法意味着无法通过LateUpdate访问gameObject?

最终解决方案:

尽管编辑中的代码确实起作用,但它会发出警告,因为我将我的GameObject gameObject称为“对象”,这是一个预定义的对象,它引用脚本所附加的对象。最终代码应如下所示:

private GameObject doodler;

void Start() {
    doodler = GameObject.Find("Doodler");
    Debug.Log("START Found the Doodler: " + doodler.GetInstanceID());
}

最佳答案

在对问题进行了编辑并找到了解决方法之后,由于您当前的代码,我仍然认为有必要为该问题留下一个答案。

显然,您需要先使变量成为全局变量,然后才能在另一个函数中访问它。您已解决此问题,但还有一个尚不知道的大问题,并且有一个原因是您尝试从另一个函数访问本地函数中声明的变量时从未出错。您应该收到原始代码错误,但没有收到。

您当前正在执行此操作:

private GameObject gameObject;

void Start()
{
    gameObject = GameObject.Find("Doodler");
}


然后在LateUpdate函数中使用它:

void LateUpdate ()
{
    if (gameObject.transform.position.y > transform.position.y) {...}
}


问题:

您的脚本从MonoBehaviour派生,而BehaviourComponent派生,然后从Component派生。

在该gameObject脚本中,有一个名为“ GameObject”的变量,它是MonoBehaviour的类型。声明如下:

public GameObject gameObject { get; }


由于您的脚本是从gameObject派生的,因此该It refers to the变量已经声明并且可以使用。 that this script is attached to. GameObject new

实际上,现在,您应该会收到类似如下的警告:


  严重性代码说明项目文件行抑制状态
  警告CS0108'YourScript.gameObject'隐藏继承的成员
  'Component.gameObject'。如果要隐藏,请使用new关键字。


该怎么办:

当然,您可以使用gameObject关键字将其隐藏并删除该警告:

private new GameObject gameObject;


不要那样做。不要将变量“ MonoBehaviour”命名为任何名称,也不要使用类已使用的任何名称。此代码将导致很多问题。我已经看到了由此引起的几个问题,很难发现这就是问题所在。如下所示应该可以:

private GameObject doodler;

void Start()
{
    doodler = GameObject.Find("Doodler");
}

关于c# - Unity中的DontDestroyOnLoad()并在以后的场景中引用(使用C#),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47381079/

10-12 15:26