【问题标题】:Is there any way to assign player to Camera after the game started in unity?游戏统一开始后有没有办法将玩家分配给相机?
【发布时间】:2021-04-10 17:17:53
【问题描述】:

好的,所以我创建了一个包含角色选择的无尽奔跑游戏。目标是,当场景开始时(层次结构中没有玩家),游戏管理器将根据所选玩家实例化玩家。但是,CameraController 出现错误“对象引用未设置为对象的实例”,它找不到实例化播放器对象

这是我实例化播放器的方式:

void Start()
{
    int selectedCharacter = PlayerPrefs.GetInt("selectedChar");
    GameObject prefab = characterPrefabs[selectedCharacter];
    GameObject clone = Instantiate(prefab, playerStartPoint, Quaternion.identity);
    player = FindObjectOfType<PlayerScript>();
    platformStartPoint = platformGenerator.position;
    scoreManager = FindObjectOfType<ScoreManager>();
    Reset();
}

这是我的相机脚本:

public class CameraController : MonoBehaviour{
public PlayerScript player;
private Vector3 lastPlayerPosition;
private float distToMove;
// Start is called before the first frame update
void Start()
{
    player = FindObjectOfType<PlayerScript>();
    lastPlayerPosition = player.transform.position;
}

// Update is called once per frame
void Update()
{
    distToMove = player.transform.position.x - lastPlayerPosition.x;
    transform.position = new Vector3(transform.position.x + distToMove, transform.position.y, transform.position.z);
    lastPlayerPosition = player.transform.position;
}
}

相机应该随着角色移动,你知道如何解决这个问题吗?谢谢

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我假设您的相机会根据您提到的内容在播放器实例化之前尝试搜索播放器。有几种不同的方法可以解决此问题。

    方法一

    让实例化玩家的脚本抓取相机并分配玩家实例。

    示例

    // Call this after instantiating a player instance
    FindObjectOfType<CameraController>().AssignTarget(player);
    
    // Add this to CameraController.cs
    public void AssignTarget(PlayerScript player)
    {
        this.player = player;
        lastPlayerPosition = player.transform.position;
    }
    

    方法二

    在某处添加一个事件字段,通知播放器何时被实例化并使用您的相机订阅它。

    示例

    using System;
    using UnityEngine;
    
    public class PlayerScript : MonoBehaviour
    {
        public static event Action<PlayerScript> InstanceStarted;
    
        private void Start()
        {
            InstanceStarted?.Invoke(this);
        }
    }
    

    using UnityEngine;
    
    public class CameraController : MonoBehaviour
    {
        private Player player;
    
        private void Start()
        {
            player = FindObjectOfType<PlayerScript>();
            if (player == null)
                PlayerScript.InstanceStarted += OnPlayerInstanceStarted;
        }
    
        private void OnPlayerInstanceStarted(PlayerScript instance)
        {
            PlayerScript.InstanceStarted -= OnPlayerInstanceStarted;
            player = instance;
        }
    }
    

    方法3

    DefaultExecutionOrder 属性添加到您的脚本并更改执行顺序以确保播放器在相机开始寻找之前被实例化。

    示例

    [DefaultExecutionOrder(100)]
    public class TestScript : MonoBehaviour {}
    

    方法四

    拥有一个Coroutine,它会在允许相机执行任何操作之前定期检查播放器实例是否可用。

    示例

    using System.Collections;
    using UnityEngine;
    
    public class CameraController : MonoBehaviour
    {
        private PlayerScript player;
    
        private void Start()
        {
            StartCoroutine(StartOncePlayerIsFound());
        }
    
        private IEnumerator StartOncePlayerIsFound()
        {
            player = FindObjectOfType<PlayerScript>();
            while (player == null)
            {
                // Feel free to yield "WaitForEndOfFrame" or "null"
                // if you wish to search for player every frame
    
                yield return new WaitForSeconds(0.1f);
                player = FindObjectOfType<PlayerScript>();
            }
    
            // ...
        }
    }
    

    【讨论】:

    • 你能解释一下第一种方法吗?
    • @ParamaArtha 实例化播放器实例后,您去寻找CameraController 实例并将新创建的播放器实例传递给它。
    • @ParamaArtha 用一个简短的例子更新了答案。随意看看。
    【解决方案2】:

    试试这个

    transform.position = new Vector3(player.transform.position.x, transform.position.y, transform.position.z);
    

    【讨论】:

    • 感谢回复,但错误是相机无法检测到玩家游戏对象,我已经编辑了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 2023-03-15
    • 2021-09-13
    • 2022-11-25
    • 1970-01-01
    • 2022-08-07
    相关资源
    最近更新 更多