unity3d 有没有办法为不同的角色设置不同的摄像Angular ?

cvxl0en2  于 2023-03-09  发布在  Angular
关注(0)|答案(1)|浏览(142)

我正在为一个学校项目开发一个3D游戏,其中有三个可选择的角色,大小都不同,我已经编写了一些代码,使相机连接到所选的角色。
我遇到的一个问题是,相机停留在同一位置,无论选择哪个角色,这使得它有点尴尬选择一个较小的角色和视野太高或选择一个较大的角色和视野太低。
我要提到的是,我的角色选择工作的方式是,一旦一个被选中,它会创建一个'克隆'的预置在游戏场景中,这使得它稍微复杂,因为我只能看到变化,而游戏正在运行,使其难以保存更改我的实验。
我在主摄像头上附加了3次CameraFollow脚本,每一次都是独立的组件,我认为它可能会有影响,但无论如何它仍然固定在同一个地方。我会附上截图和相关脚本。
角色选择脚本:

using UnityEngine;
using UnityEngine.SceneManagement;

public class CharacterSelection : MonoBehaviour
{
    public GameObject[] characters;
    public int selectedCharacter = 0;

    public void NextCharacter()
    {
        characters[selectedCharacter].SetActive(false);
        selectedCharacter = (selectedCharacter + 1) % characters.Length;
        characters[selectedCharacter].SetActive(true);
    }

    public void PreviousCharacter()
    {
        characters[selectedCharacter].SetActive(false);
        selectedCharacter--;
        if (selectedCharacter < 0)
        {
            selectedCharacter += characters.Length;
        }
        characters[selectedCharacter].SetActive(true);
    }

    public void StartGame()
    {
        PlayerPrefs.SetInt("selectedCharacter", selectedCharacter);
        SceneManager.LoadScene(2, LoadSceneMode.Single);
    }
}

角色加载脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class LoadCharacter : MonoBehaviour
{
    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;
    }
}

摄像机跟随脚本:

using System.Collections;
using System.Collections.Generic;
using Mono.CompilerServices.SymbolWriter;
using Unity.VisualScripting;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    [SerializeField] Transform player;
    [SerializeField] Vector3 offSet;
    void Update()
    {  
        transform.position = player.position + offSet;
    }
}

在主摄像头下的3个组件中使用脚本不起作用,我还试图将“克隆”复制到游戏场景中,这样我就可以在无需运行游戏的情况下访问它们,但没有成功。我发现最令人沮丧的是,预制件一旦从角色选择菜单中选择就会作为克隆加载,除非游戏正在运行,否则我无法访问它们,这意味着我将无法保存任何编辑。我担心同样的问题可能会出现时,试图添加移动脚本的字符,一旦他们已经加载。我不是很有经验的统一,只有工作了大约2个星期,现在我的问题是太具体,我找不到一个教程。
如果有人能提供帮助,并给予一个初学者可以理解的答案,特别是关于整个克隆情况和如何处理它,那将非常感激。
第一节第一节第一节第一节第一节第二节第一节

lndjwyie

lndjwyie1#

添加同一CameraFollow脚本的多个示例可能不起作用,因为每个示例都将践踏其他示例对transform.position的更改,因此最终只有最后一个执行Update()的脚本才会应用每个帧的更改。
另一种方法是在你的相机上有一个CameraFollow示例,但是让每个角色指定相机应该使用的偏移量。这样,当你加载一个角色时,你可以相应地更新偏移量。
这看起来像什么?首先,你需要一个脚本,你可以附加到你的角色(如果你还没有一个):

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()
    {  
        if (player == null)
        {
            return;
        }
        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;
    }
}

最后,我们可以使用这个新的属性和方法来确保摄像机总是调整到提供的字符:
一个二个一个一个

相关问题