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