我是一个Unity和C#的初学者,我正在为一个学校项目开发一个游戏。到目前为止,我主要是按照教程来做的,我遇到了一个问题,我觉得这个问题非常具体,需要教程来帮助。我有一个带有角色游戏对象的选择菜单,其中有3个我想使用的角色的预置。我的问题是,无论何时游戏角色选择并加载到游戏中,摄像机Angular 保持固定,与预制件无关,这使得拥有不同大小的预制件很尴尬,因为它离角色的背部太近或太远。我应该提到的一件事是,在选择角色后,游戏对象克隆被加载到游戏场景中,除非游戏正在运行,否则我无法访问该场景,这使得保存更改变得很困难。我想知道我如何才能将脚本更改为首先关闭,将相机Angular 附加到预制件上,但每个角色都是唯一的,因为有3个,所有的预制件大小不一,所以在某些情况下,相机太远,在某些情况下,它太近。我预计,这也将成为一个问题,以后下来的路线,当我试图分配独特的moveset每个字符,和不同的移动脚本,能够确定速度的字符,以确保他们可以移动在不同的速度,所以我正在寻找,看看是否有一种方法,以涵盖这3个问题,但目前我的工作只是让相机附加到字符预制。
我昨天发布了一个非常类似的问题,有人建议我稍微修改一下脚本,我照做了,我会给你看的。
说的人首先建议我附上一个脚本,以附加到我的每个字符,我用它并附加到预制件,我猜附加到'字符'或预制件有同样的效果。这是脚本:
public class Character : MonoBehaviour
{
// This should be set to the required camera offset for this character
[SerializeField] Vector3 offSet;
public Vector3 OffSet
{
get
{
return offSet;
}
}
// [...]
}
然后建议CameraFollow脚本需要一个新方法,这是它现在的样子:
public class CameraFollow : MonoBehaviour
{
[SerializeField] Transform player;
[SerializeField] Vector3 offSet;
void Update()
{
transform.position = player.position + offSet;
}
// This will allow us to change what the camera is looking at
public void SetFollowTarget(Transform player, Vector3 offSet)
{
this.player = player;
this.offSet = offSet;
}
}
然后有人建议需要对CharacterSelection脚本进行一些更改,这就是我开始遇到问题的地方:
public class CharacterSelection : MonoBehaviour
{
// We'll need a reference to the CameraFollow script to change this, though
// you could use a singleton or some other approach to get the reference
[SerializeField]
CameraFollow cameraFollow;
// Let's change this to an array of Character to easily access their properties
public Character[] characters;
public int selectedCharacter = 0;
public void NextCharacter()
{
characters[selectedCharacter].gameObject.SetActive(false);
selectedCharacter = (selectedCharacter + 1) % characters.Length;
characters[selectedCharacter].gameObject.SetActive(true);
UpdateCameraForSelectedCharacter();
}
public void PreviousCharacter()
{
characters[selectedCharacter].gameObject.SetActive(false);
selectedCharacter--;
if (selectedCharacter < 0)
{
selectedCharacter += characters.Length;
}
characters[selectedCharacter].gameObject.SetActive(true);
UpdateCameraForSelectedCharacter();
}\\\\\\\\\
// [...]
// With the new property and method, it's a cinch to update the camera now
private void UpdateCameraForSelectedCharacter()
{
cameraFollow.SetFollowTarget(
characters[selectedCharacter].transform,
characters[selectedCharacter].OffSet);
}
}
这个脚本和我之前的有些不同,但是它仍然和我的角色游戏对象连接,里面有所有的预置。在游戏对象的脚本组件中,每个元素都填充了角色的预置。我发现了一件关于Unity中的摄像机跟随字段的事情,在字段中它说None(摄像机跟随),我不确定它是否应该是这样的。
继续加载角色脚本:
public class LoadCharacter : MonoBehaviour
{
[SerializeField]
CameraFollow cameraFollow;
public GameObject[] characterPrefabs;
public Transform spawnPoint;
public TMP_Text label;
void Start()
{
int selectedCharacter = PlayerPrefs.GetInt("selectedCharacter");
GameObject prefab = characterPrefabs[selectedCharacter];
GameObject clone = Instantiate(prefab, spawnPoint.position, Quaternion.identity);
label.text = prefab.name;
// In the same way, we can easily update the camera on scene load
Character character = clone.GetComponent<Character>();
cameraFollow.SetFollowTarget(
character.transform,
character.OffSet);
}
}
这个脚本是附加到一个游戏管理器对象在实际的游戏场景。我可能应该在这里提到,使用这个脚本而不是我的旧的,已经造成了一个问题,现在我不能加载到游戏场景后,选择我的角色在选择场景。正因为如此,我仍然没有能够得到过去的整个克隆问题,我还没有能够看到如何执行的代码,而游戏正在运行。
可能有一些东西我误解了,因为我是一个巨大的团结和c# noob,但如果有人能帮助,这将是相当不错的。
顺便说一下,非常感谢Serlite帮助制作这些新脚本,可惜我知道的还不够。
1条答案
按热度按时间zpgglvta1#
脚本看起来很好。固定Angular 的事情是因为,至少从提供的脚本来看,你没有做任何关于旋转的事情。CameraFollow只是更新相机的位置,但没有告诉相机要看什么。一个想法是将offset改为followOffset,并添加一个新的lookOffset,你的CameraFollow更新可能如下所示:
基本上,followOffset是将摄影机放置在角色后面某个位置的偏移,而lookOffset是到玩家前面您希望摄影机查看的点的偏移。
另外据我所知,你有一个脚本称为字符是每个球员预置。因此,你可以编辑默认值在预置的偏移和保存。只是要确保把合理的偏移和始终认为偏移方面的球员的前进方向,你希望相机放在后面的球员。
在每个预置件上,你可以有不同的移动脚本(如果它们太不同的话),或者只有一个可以处理所有情况。
至于场景加载问题,取决于你如何加载场景。如果你加载加法,我不明白为什么它会失败。你必须更具体,即从Unity给予我们错误消息或更精确的问题描述。