【发布时间】:2018-05-03 00:38:31
【问题描述】:
我正在 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.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 游戏对象,这是一个预定义的对象,指的是脚本附加到的对象。最终代码应如下所示:
private GameObject doodler;
void Start() {
doodler = GameObject.Find("Doodler");
Debug.Log("START Found the Doodler: " + doodler.GetInstanceID());
}
【问题讨论】:
-
“但它似乎没有找到 Doodler,因此” 如果 Doodler 对象未处于活动状态,
GameObject.Find将找不到它。如果还没有出现在场景中,GameObject.Find也找不到。是哪一个? -
它是在 LateUpdate 方法中找到的,但不是在 Start 方法中找到的,所以我想知道什么时候 DontDestroyOnLoad 对象在新场景中可用。但是,看起来我已经按照上面的编辑修复了它。
-
在您使用当前和旧代码更新问题后,我决定留下答案。请阅读。