You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity不同尺寸角色的相机视角适配问题求助

3D游戏角色选择与相机跟随问题解决方案

问题概述

我正在开发一个学校项目的3D游戏,有三个尺寸不同的可选角色,已实现相机跟随选中角色,但遇到两个核心问题:

  • 相机偏移量固定,选小角色时视角过高,大角色时视角过低
  • 角色以预制体克隆形式加载到场景,仅运行时可见,无法保存编辑,担心后续添加移动脚本也会有同样问题

尝试过的无效操作:给主相机添加3个CameraFollow脚本;复制克隆到场景失败。接触Unity仅2周,找不到针对性教程。


解决方案一:适配不同角色的相机跟随

当前CameraFollow使用固定世界坐标偏移,导致不同尺寸角色视角异常,改成基于角色头部位置动态计算偏移即可解决:

修改后的CameraFollow脚本

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    [SerializeField] Transform player;
    // 相对于角色头顶的偏移,而非固定世界坐标偏移
    [SerializeField] Vector3 offsetFromHead;
    private Transform playerHead;

    void Start()
    {
        // 自动获取角色头部(需给每个角色预制体添加名为"Head"的空物体作为标记,放在头顶位置)
        playerHead = player.Find("Head");
        if (playerHead == null)
        {
            Debug.LogWarning("角色未找到Head子物体,将使用根物体计算");
            playerHead = player;
        }
    }

    void LateUpdate()
    {
        if (playerHead != null)
        {
            // 基于角色头部位置计算相机位置
            transform.position = playerHead.position + offsetFromHead;
            // 可选:让相机始终看向角色
            transform.LookAt(player);
        }
    }
}

配套操作

  1. 给每个角色预制体添加空物体,命名为Head,拖到角色头顶合适位置
  2. 主相机挂载上述脚本,在Inspector面板设置offsetFromHead(例如(0, 1, -3),可根据需求调整)
  3. 修改LoadCharacter脚本,让生成角色克隆后自动给相机赋值跟随目标:
using UnityEngine;
using TMPro;

public class LoadCharacter : MonoBehaviour
{
    public GameObject[] characterPrefabs;
    public Transform spawnPoint;
    public TMP_Text label;
    // 在Inspector拖入主相机
    public Camera mainCamera;

    void Start()
    {
        int selectedCharacter = PlayerPrefs.GetInt("selectedCharacter");
        GameObject prefab = characterPrefabs[selectedCharacter];
        GameObject clone = Instantiate(prefab, spawnPoint.position, Quaternion.identity);
        label.text = prefab.name;

        // 自动绑定相机跟随目标
        CameraFollow cameraFollow = mainCamera.GetComponent<CameraFollow>();
        if (cameraFollow != null)
        {
            cameraFollow.player = clone.transform;
        }
    }
}

解决方案二:解决克隆预制体无法编辑的问题

克隆是运行时临时生成的,无法直接保存,推荐两种长效处理方式:

方式1:直接编辑原始预制体

所有角色逻辑(比如移动脚本、动画组件)直接添加到Project窗口的原始预制体上,运行时生成的克隆会自动继承这些内容,无需编辑克隆:

  1. 双击Project窗口的角色预制体,进入预制体编辑模式
  2. 添加所需组件、调整参数后保存,克隆会自动同步这些设置

方式2:使用预制体变体(Prefab Variant)

如果需要给不同角色做差异化调整(比如尺寸、移动速度),用预制体变体保留原始预制体的基础逻辑:

  1. 选中原始预制体,右键选择Create > Prefab Variant
  2. 在变体中修改角色尺寸、组件参数,不影响原始预制体
  3. 将变体加入characterPrefabs数组,运行时生成的克隆会保留变体的修改

临时调试方法(保存运行时克隆)

如果需要临时把克隆转为可编辑的场景物体:

  1. 运行游戏,选中生成的克隆
  2. 右键选择Copy,停止游戏
  3. 在Hierarchy窗口右键选择Paste,克隆会转为场景物体,可编辑保存

原始脚本备份

角色选择脚本(CharacterSelection)

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);
    }
}

原始角色加载脚本(LoadCharacter)

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;
    }
}

原始相机跟随脚本(CameraFollow)

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

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

视角问题截图

  • 大角色视角:大角色视角
  • 中等尺寸角色视角:中等尺寸角色视角
  • 小角色视角:小角色视角

内容的提问来源于stack exchange,提问作者Raffaele Ozunu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:50:03