unity3d 我怎样才能将主摄像机附加到不同的角色上,并在他们被选中时让他们有自己的动作脚本?

pxy2qtax  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(88)

我是一个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帮助制作这些新脚本,可惜我知道的还不够。

zpgglvta

zpgglvta1#

脚本看起来很好。固定Angular 的事情是因为,至少从提供的脚本来看,你没有做任何关于旋转的事情。CameraFollow只是更新相机的位置,但没有告诉相机要看什么。一个想法是将offset改为followOffset,并添加一个新的lookOffset,你的CameraFollow更新可能如下所示:

transform.position = player.position + followOffSet;
transform.LookAt(player.position + lookOffset;

基本上,followOffset是将摄影机放置在角色后面某个位置的偏移,而lookOffset是到玩家前面您希望摄影机查看的点的偏移。
另外据我所知,你有一个脚本称为字符是每个球员预置。因此,你可以编辑默认值在预置的偏移和保存。只是要确保把合理的偏移和始终认为偏移方面的球员的前进方向,你希望相机放在后面的球员。
在每个预置件上,你可以有不同的移动脚本(如果它们太不同的话),或者只有一个可以处理所有情况。
至于场景加载问题,取决于你如何加载场景。如果你加载加法,我不明白为什么它会失败。你必须更具体,即从Unity给予我们错误消息或更精确的问题描述。

相关问题