处理预制

时间:2019-06-17 06:32:43

标签: c# unity3d

我试图让摄像机跟随我的播放器(通过预制实例化),但我的摄像机脚本中不断出现错误。

我的相机脚本(错误在offset = transform.position - Game.currentPlayer.transform.position;行中):

public class CameraControl : MonoBehaviour
{
    private Vector3 offset;

    private void Awake()
    {
        offset = transform.position - Game.currentPlayer.transform.position;
    }

    void LateUpdate()
    {
        transform.position = Game.currentPlayer.transform.position + offset;
    }
}

我在这里设置currentPlayer变量:

void Start()
    {
        GameObject newPlayer = Instantiate(player,transform.position,transform.rotation);
        newPlayer.name = "Player";
        currentPlayer = newPlayer;
    }

如果您需要其他脚本来帮助,只需询问:)

1 个答案:

答案 0 :(得分:1)

AwakeStart之前被调用。实际上,甚至所有 Awake方法都在之前被调用之前完成(另请参见Order of Execution for Event Functions)。

因此尚未在Start中设置参考。

您将不得不将其移至Awake方法或将实例化部分移至Start

在两种情况下,仍不能保证Awake脚本将在Game之前执行其Start。因此,您仍然必须调整Script Execution Order,以使GameControl总是在Game之前被执行。

  • 打开“编辑”>“项目设置”>“脚本执行顺序”
  • GameControl块之前拖放Game脚本
  • 还可以选择对现有项目进行分类

或者,您可以使用事件系统:

DefaultTime

,然后在public class Game : MonoBehaviour { public static event Action OnInitilalized; public static GameObject currentPlayer; privtae void Start() { GameObject newPlayer = Instantiate(player,transform.position,transform.rotation); newPlayer.name = "Player"; currentPlayer = newPlayer; OnInitilalized?.Invoke(); } } 中向GameControl事件添加回调,例如

OnInitialized