Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在unity游戏开始后,有没有办法将玩家分配到摄像机?_C#_Unity3d - Fatal编程技术网

C# 在unity游戏开始后,有没有办法将玩家分配到摄像机?

C# 在unity游戏开始后,有没有办法将玩家分配到摄像机?,c#,unity3d,C#,Unity3d,好的,我创建了一个有角色选择的无止境跑步者游戏。目标是,当场景开始时(层次结构中没有玩家),游戏管理器将基于所选玩家实例化玩家。但是,CameraController出现错误“对象引用未设置为对象的实例”,它无法找到实例化的播放器对象 以下是我如何实例化我的播放器: void Start() { int selectedCharacter = PlayerPrefs.GetInt("selectedChar"); GameObject prefab = cha

好的,我创建了一个有角色选择的无止境跑步者游戏。目标是,当场景开始时(层次结构中没有玩家),游戏管理器将基于所选玩家实例化玩家。但是,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();
}
void Start()
{
int selectedCharacter=PlayerPrefs.GetInt(“selectedChar”);
GameObject预置=角色预置[selectedCharacter];
GameObject clone=实例化(预置、玩家起点、四元数.identity);
player=FindObjectOfType();
platformStartPoint=platformGenerator.position;
scoreManager=FindObjectOfType();
重置();
}
这是我的相机脚本:

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;
}
}
公共类CameraController:MonoBehavior{
公共玩家脚本播放器;
私人矢量3最后播放位置;
私人浮动区;
//在第一帧更新之前调用Start
void Start()
{
player=FindObjectOfType();
lastPlayerPosition=player.transform.position;
}
//每帧调用一次更新
无效更新()
{
distToMove=player.transform.position.x-lastPlayerPosition.x;
transform.position=新矢量3(transform.position.x+distToMove,transform.position.y,transform.position.z);
lastPlayerPosition=player.transform.position;
}
}
相机应该和角色一起移动,你知道怎么解决这个问题吗?谢谢

试试这个

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

我假设你的相机会在玩家根据你提到的被实例化之前搜索玩家。有几种不同的方法可以解决这个问题

方法1 让实例化玩家的脚本抓起相机并分配玩家实例

例子 方法2 在某处添加一个事件字段,通知玩家何时被实例化,并使用相机订阅

例子 方法4 在允许相机执行任何操作之前,请使用一个工具定期检查播放器的实例是否可用

例子
使用系统集合;
使用UnityEngine;
公共类CameraController:MonoBehavior
{
私人玩家脚本播放器;
私有void Start()
{
start例程(StartOncePlayerIsFound());
}
私有IEnumerator StartOncePlayerIsFound()
{
player=FindObjectOfType();
while(player==null)
{
//可以随意生成“WaitForEndOfFrame”或“null”
//如果您希望在每帧中搜索播放器
收益率返回新WaitForSeconds(0.1f);
player=FindObjectOfType();
}
// ...
}
}

谢谢您的回复,但错误是摄像头无法检测到玩家游戏对象,我已经编辑了我的问题,您能解释一下第一种方法吗?@paramartha在实例化玩家实例后,您可以查找一个
CameraController
实例,并将新创建的播放器实例传递给它。@ParamaArtha用一个简短的示例更新了答案。随便看看。谢谢,它很管用
// 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;
    }
}
[DefaultExecutionOrder(100)]
public class TestScript : MonoBehaviour {}
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>();
        }

        // ...
    }
}