unity3d 如何找到游戏对象,然后使用它们的位置?

tvmytwxo  于 2022-12-19  发布在  其他
关注(0)|答案(3)|浏览(142)

当我的玩家死亡并重生时,我试图让我的摄像头看到新示例化的玩家。

public class CameraController : MonoBehaviour
{

    void Update()
    {
        var target = GameObject.FindGameObjectWithTag("Player");
        Transform target;

        transform.LookAt(target);
    }
}

我尝试在没有公共“拖放”Transform变量的情况下执行此操作。
我没有任何问题,只是我的基本球员,但当我试图重生与示例化(),相机无法检测到副本。

xqnpmsa8

xqnpmsa81#

我们删除了Transform target;,而使用

transform.LookAt(target.transform);

...一般而言,出于性能考虑,您应避免在Update中使用任何Find变体,而是在Start中使用一次,然后重用该引用

public class CameraController : MonoBehaviour
{
    private Transform target;

    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Player").transform;
    }

    void Update()
    {
        transform.LookAt(target);
    }
}
8ulbf1ek

8ulbf1ek2#

我找到了一个解决办法。对于其他想找类似东西的人:

public class CameraController : MonoBehaviour

{

Transform target;

void Update()
{
    GameObject target1 = GameObject.FindGameObjectWithTag("Player");
    target = target1.transform;

    transform.LookAt(target);
}

}

vmdwslir

vmdwslir3#

你遇到的第一个问题是你正在寻找玩家的游戏对象,它的类型“var”将被设置为。之后,当你将目标设置为具有空值的类型Transform时,它将被覆盖。获得玩家的Transform组件并将目标设置为相等,这将解决你的问题。
然而,性能方面:
您希望避免在Update()中搜索游戏对象,而是一次性找到您要搜索的内容并缓存它。找到游戏对象是一个代价高昂的操作,将其放在Update()中将在每个周期执行该操作。
更适合CPU的处理方式如下所示:

Transform target;

public void findTarget(string targetToFind)
{
    // potentially do some error handling here in case the gameobject hasn't loaded in yet
    target = GameObject.FindGameObjectWithTag(targetToFind).transform;
}

void Update()
{
    transform.LookAt(target);
}

我的工作方式是在角色重生时调用脚本中的findTarget方法,并将其传递给player标记,这也使该方法更加通用,因此如果您希望将摄像机移动到电影事件或类似事件的不同目标,则可以使用其他摄像机移位技巧。

相关问题