恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Unity 2021第三人称漫游:场景搭建、控制器与避坑指南

  • 首页
  • 资讯中心
  • /
  • Unity 2021第三人称漫游:场景搭建、控制器与避坑指南

相关资讯

Flash 对 Mimo、GLM:中文代码 Agent 场景的“性价比之王“实测横评 2026/10/10 20:36:22
基于C语言编译器开发实战:从词法分析到目标代码生成 2026/10/10 20:31:22
回溯算法核心思想与统一模板:从递归到剪枝优化实战解析 2026/10/10 20:31:22

最新资讯

DHUOJ基础题25-27解析:素数判断、整数倒序与回文串的边界处理
自注册、AST发现与中央分发派系:弹性工具运行时架构解析
基于YOLOv8的道路病害检测平台:从模型训练到前后端部署全流程
电力遥感杆塔检测数据集:400张图跑通YOLO全流程
AI 推理 KV Cache 淘汰:别让长会话吃掉所有显存——TaoToken 统一 Key 下的显存压测与淘汰策略验证
9.5k stars 与日榜 18:YuE2 系列的技术底座和社区入口设计拆解

今日推荐

Codex 总用英文回答?从 AGENTS.md 到 config.toml 的中文输出调优指南
OpenClaw 自定义插件开发完整指南(2026最新版):从 TypeScript 到 npm 发布
基于Spark的电影推荐系统全链路实战:从爬虫到Web展示

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Unity 2021第三人称漫游:场景搭建、控制器与避坑指南

发布时间:2026/10/10 20:36:22
Unity 2021第三人称漫游:场景搭建、控制器与避坑指南 简介这份资源是面向Unity初学者与在校学生的期末大作业级项目基于Unity2021版本构建第三人称漫游场景帮助读者掌握角色控制、场景搭建与UI交互等核心开发流程。包内共约2000个文件以cs脚本、png贴图、fbx模型、prefab预制体、unity场景与mat材质为主另含anim动画、shader着色器、uss/uxml界面样式及mp3音效等压缩包约113MB目录结构完整可直接导入编辑器运行与二次修改。项目涵盖山谷、房屋、桌椅等精细模型通过鼠标控制小狐狸移动并配有血条、菜单与按钮等UGUI元素涉及CharacterController移动逻辑、光照与PBR材质、Animator动画及Input Manager输入管理是理解第三人称视角与场景优化的实用范例。目前已有2994人学习下载适合需要完整赛题方案、模块化代码参考与场景搭建思路的开发者对照练习。1. 期末作业里的第三人称漫游为什么你的场景总像“纸片人走迷宫”做 Unity 期末作业的同学十个里有八个会选第三人称漫游。理由很直接第一人称太晕固定视角太呆第三人称既能展示角色模型又能让老师看到场景全貌。但真正动手之后翻车现场比比皆是——角色像纸片一样飘着走镜头穿墙穿树场景光照要么惨白要么死黑最后交上去的作业自己都不想打开看第二遍。这个标题拆开来看核心是三件事第三人称控制器的搭建、漫游场景的模型组织、以及 Unity 2021 这个特定版本下的渲染与输入配置。它适合正在赶期末作业的学生也适合刚接触 Unity 想做一个完整可交互场景的入门开发者。我见过太多人把时间花在找“精美模型包”上结果导入之后材质全丢、角色卡在楼梯上、镜头一转就穿到地板下面。这篇笔记就按我实际做这类作业的顺序从场景搭建到控制器代码再到避坑排查一步步讲清楚。2. 场景与模型从零搭出一个能漫游的“精美”底子2.1 为什么你的场景导入后像“买家秀”很多人第一步就错了直接去资源站下载一个场景包解压后把整个文件夹拖进 Assets然后打开场景一看——粉红色的材质球铺满屏幕。这不是模型的问题是渲染管线不匹配。Unity 2021 默认新建项目用的是 Built-in Render Pipeline但很多“精美场景”资源包是基于 URP 或 HDRP 制作的。你直接导入Shader 找不到对应的管线自然全变粉。正确的做法是先确认你的项目管线。打开 Package Manager看有没有 Universal RP 或 High Definition RP。如果没有而资源包又明确写了 URP那你有两个选择要么把项目升级到 URP要么找 Built-in 版本的资源。升级 URP 的步骤不复杂但要注意升级后所有材质都要重新指定 Shader光照参数也会变。我一般建议期末作业这种工期紧的情况直接新建一个 URP 项目再把资源包导入省去中途转换的麻烦。提示新建项目时选 “3D (URP)” 模板不要选 “3D Core”。后者是 Built-in 管线导入 URP 资源必粉。2.2 场景搭建地形、建筑、植被的层级组织一个能漫游的场景不需要多复杂但必须有层次。我通常按这个结构组织 HierarchyEnvironment ├── Terrain (地形) ├── Buildings (建筑群) │ ├── Building_A │ ├── Building_B │ └── ... ├── Props (道具) │ ├── Bench │ ├── Lamp │ └── ... ├── Vegetation (植被) │ ├── Trees │ └── Grass └── Lighting (灯光) ├── Directional Light └── Point Lights这样做的好处是后面做遮挡剔除、光照烘焙、或者批量调整的时候不会在一堆乱命名的物体里找花眼。地形用 Unity 自带的 Terrain 工具刷一个起伏建筑用 ProBuilder 快速搭几个方块组合植被用 Terrain 的 Paint Trees 功能刷上去。注意树木和草的密度不要太高否则期末作业在老师电脑上跑起来直接卡成幻灯片印象分全没了。模型导入设置里有一个关键参数Generate Colliders。建筑和地面必须勾选否则角色直接穿模掉进虚空。树木如果只是装饰可以不勾但如果你想让角色撞到树会停下就得手动加 Capsule Collider。我一般会给树干加一个细长的 Capsule Collider树冠不加这样角色从树冠下走过不会莫名其妙被弹开。2.3 光照与后处理让场景“精美”的最低成本方案“精美”这个词很虚但落到 Unity 里其实就是光照和后处理两个东西。Unity 2021 的 URP 下光照配置比 Built-in 简单很多。我一般这么做Directional Light 强度调到 1.2 左右颜色稍微偏暖比如 #FFF4E0模拟日光。环境光Environment Lighting用 Gradient 模式Sky 颜色浅蓝Equator 灰白Ground 深灰。这样阴影里不会死黑。开启 Soft Shadows阴影强度调到 0.7 左右太硬像刀切太软像糊了。后处理加三个Bloom强度 0.3、Vignette强度 0.2、Color Grading稍微拉一点对比度和饱和度。这些参数不是死的但有一个原则宁可欠一点不要过。Bloom 开太大整个场景像仙境老师一看就知道你在掩盖模型粗糙。Vignette 太重四周黑一圈像用望远镜看世界。我见过一个作业Bloom 拉到 1.5所有白色建筑都在发光像核爆现场。注意后处理 Volume 要放在场景里并且确保 Camera 的 Post Processing 勾选打开。URP 下还要检查 Volume 的 Mode 是 Global 还是 Local别设成 Local 结果忘了加 Collider。3. 第三人称控制器从 CharacterController 到镜头跟随的完整实现3.1 为什么不用 Rigidbody 而用 CharacterController第三人称漫游的核心是角色移动和镜头跟随。Unity 提供了两种主流方案Rigidbody Collider 和 CharacterController。期末作业这种场景我强烈建议用 CharacterController。原因很简单Rigidbody 受物理引擎影响角色会被场景里的杂物推来推去上楼梯会卡撞墙会弹。CharacterController 是一个专门为角色移动设计的组件自带斜坡检测、台阶检测、碰撞滑动代码量少行为可控。代价是 CharacterController 不参与物理模拟你不能直接给它施加力。但对于漫游来说这恰恰是优点——你不需要角色被风吹走也不需要他被炸弹炸飞。你只需要他稳稳地走、跑、跳。3.2 角色移动代码输入、方向、重力、跳跃下面是我在期末作业里反复用的一套移动代码基于 Unity 2021 的旧输入系统Input Manager因为大部分教学资源还是这套兼容性好。using UnityEngine; [RequireComponent(typeof(CharacterController))] public class ThirdPersonMovement : MonoBehaviour { public float walkSpeed 3.5f; // 行走速度 public float runSpeed 7f; // 奔跑速度 public float jumpHeight 1.2f; // 跳跃高度 public float gravity -20f; // 重力加速度比真实值大手感更“游戏” public float turnSmoothTime 0.1f; // 转向平滑时间 private CharacterController controller; private Transform cam; private float turnSmoothVelocity; private Vector3 velocity; // 垂直速度重力跳跃 private bool isGrounded; void Start() { controller GetComponentCharacterController(); cam Camera.main.transform; } void Update() { // 1. 检测是否着地 isGrounded controller.isGrounded; if (isGrounded velocity.y 0) { velocity.y -2f; // 轻微向下压保证 isGrounded 稳定 } // 2. 读取输入 float horizontal Input.GetAxisRaw(Horizontal); float vertical Input.GetAxisRaw(Vertical); Vector3 direction new Vector3(horizontal, 0f, vertical).normalized; // 3. 移动与转向 if (direction.magnitude 0.1f) { // 根据相机朝向计算目标角度 float targetAngle Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg cam.eulerAngles.y; float angle Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime); transform.rotation Quaternion.Euler(0f, angle, 0f); // 移动方向与相机对齐 Vector3 moveDir Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward; float speed Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed; controller.Move(moveDir.normalized * speed * Time.deltaTime); } // 4. 跳跃 if (Input.GetButtonDown(Jump) isGrounded) { velocity.y Mathf.Sqrt(jumpHeight * -2f * gravity); } // 5. 应用重力 velocity.y gravity * Time.deltaTime; controller.Move(velocity * Time.deltaTime); } }这段代码的逻辑说明isGrounded来自 CharacterController 自带检测但它在斜坡上会抖动所以着地时给velocity.y一个 -2 的向下压值保证稳定。targetAngle的计算是关键它把输入方向从世界坐标转换到相对于相机朝向的角度。这样你按 W 永远是往屏幕前方走而不是往世界 Z 轴正方向走。SmoothDampAngle让转向有缓冲不会瞬间扭头手感更自然。跳跃速度用Mathf.Sqrt(jumpHeight * -2f * gravity)计算这是物理公式反推保证跳起高度正好是jumpHeight。重力用 -20 而不是 -9.8是因为游戏手感需要更“重”的下落否则角色像在月球上。参数怎么调walkSpeed3.5 适合探索runSpeed7 适合赶路。jumpHeight1.2 能跳上大部分台阶。turnSmoothTime0.1 是默认值如果你觉得转向太滑调到 0.05觉得太生硬调到 0.2。3.3 镜头跟随Cinemachine 还是手写脚本Unity 2021 自带的 Cinemachine 是镜头跟随的最优解。不要手写Transform.LookAt加偏移那样做出来的镜头要么穿墙要么旋转生硬。Cinemachine 的 FreeLook 相机专门为第三人称设计三个轨道Top、Middle、Bottom控制不同高度的视角还能加 Collider 防止穿墙。配置步骤菜单栏 Window Package Manager确认 Cinemachine 已安装。Hierarchy 右键 Cinemachine FreeLook Camera。在 FreeLook 的 Follow 和 LookAt 里都拖入角色根物体。调整 Top、Middle、Bottom 三个 Rig 的 Radius 和 Height。我一般设 Top Radius 2.5、Height 3.5Middle Radius 3、Height 1.5Bottom Radius 2.5、Height 0.5。在 FreeLook 的 Extensions 里加 CinemachineCollider勾选 “Strategy” 为 Pull Camera Forward这样镜头碰到墙会自动拉近不会穿模。提示Cinemachine 的 Input Axis 默认绑定鼠标如果你用的是旧输入系统确保 Input Manager 里 Mouse X 和 Mouse Y 存在。如果作业要求键盘转向可以在 FreeLook 的 Axis Control 里把 X Axis 的 Input Axis Name 改成 “Mouse X”然后代码里用Input.GetAxis(Mouse X)控制。如果老师明确要求不能使用 Cinemachine那就手写一个简单的跟随脚本using UnityEngine; public class SimpleCameraFollow : MonoBehaviour { public Transform target; // 角色 public float distance 4f; // 相机距离 public float height 2f; // 相机高度 public float smoothSpeed 10f; // 跟随平滑 public float mouseSensitivity 2f; private float currentX 0f; private float currentY 0f; public float minY -20f; public float maxY 60f; void LateUpdate() { currentX Input.GetAxis(Mouse X) * mouseSensitivity; currentY - Input.GetAxis(Mouse Y) * mouseSensitivity; currentY Mathf.Clamp(currentY, minY, maxY); Vector3 dir new Vector3(0, 0, -distance); Quaternion rotation Quaternion.Euler(currentY, currentX, 0); Vector3 desiredPos target.position rotation * dir Vector3.up * height; transform.position Vector3.Lerp(transform.position, desiredPos, smoothSpeed * Time.deltaTime); transform.LookAt(target.position Vector3.up * 1.5f); // 看向角色头部 } }这个脚本的逻辑是鼠标 X 控制水平旋转鼠标 Y 控制垂直旋转相机始终在角色后方distance距离、上方height高度。LateUpdate保证在角色移动之后才更新相机避免抖动。LookAt的目标加 1.5 偏移让相机看向角色头部而不是脚底。参数说明distance4 适合大部分场景太近容易看到角色后脑勺穿模太远角色太小。height2 让相机略高于角色视野更好。smoothSpeed10 是平滑跟随如果你想要更跟手调到 20想要更电影感调到 5。4. 避坑排查期末作业里最容易翻车的五个地方4.1 角色卡在台阶上不去现象角色走到楼梯前明明台阶只有 0.2 米高就是上不去一直在原地抖。原因CharacterController 的 Step Offset 默认是 0.3但你的台阶高度可能超过了这个值或者 Slope Limit 设得太低把台阶当成了陡坡。解决选中角色在 CharacterController 组件里把 Step Offset 调到 0.4 或 0.5Slope Limit 调到 50 左右。如果还不行检查台阶的 Collider 是不是有缝隙或者台阶是不是用了 Mesh Collider 且没有勾选 Convex。4.2 镜头穿墙看到场景背面现象角色靠近墙壁时镜头直接穿进墙里看到墙的背面和外面的虚空。原因Cinemachine 的 Collider 没有启用或者手写脚本没有做射线检测。解决如果用 Cinemachine在 FreeLook 的 Extensions 里加 CinemachineCollider勾选 “Pull Camera Forward”。如果手写脚本在LateUpdate里从角色头部向相机位置发射射线如果碰到墙就把相机位置拉到碰撞点前面RaycastHit hit; if (Physics.Linecast(target.position Vector3.up * 1.5f, desiredPos, out hit)) { desiredPos hit.point - (desiredPos - target.position).normalized * 0.3f; }4.3 场景光照烘焙后出现黑斑现象烘焙 Lightmap 之后墙角、物体底部出现不规则的黑斑像被烧焦了一样。原因UV2 重叠或者光照贴图分辨率不够。Unity 2021 的 URP 下模型导入时如果没有生成 Lightmap UV烘焙就会出问题。解决选中模型在 Import Settings 的 Model 标签页里勾选 “Generate Lightmap UVs”然后 Apply。如果还不行把 Lighting 窗口里的 Lightmap Resolution 从默认的 40 降到 20或者把 Lightmap Padding 调到 4。4.4 角色移动时场景抖动现象角色走动时整个场景的物体边缘在抖像信号不好一样。原因相机跟随用了Update而不是LateUpdate或者角色的移动和相机的更新顺序不对。解决相机跟随脚本必须放在LateUpdate里。如果用了 Cinemachine检查 Brain 的 Update Method 是不是 “Late Update”。另外如果角色用了 Rigidbody把 Interpolate 设为 “Interpolate”能减少物理更新带来的抖动。4.5 打包后运行报错“Shader not found”现象在编辑器里跑得好好的打包成 exe 之后场景里所有材质变成粉红色控制台报 “Shader not found”。原因URP 的 Shader 没有被打包进去。Unity 2021 打包时只会包含场景里引用的 Shader但有些 Shader 是通过代码动态加载的或者资源包里的 Shader 没有被正确引用。解决在 Project Settings Graphics 里把 URP 的 Asset 拖进 Scriptable Render Pipeline Settings。然后在 Project Settings Quality 里确认当前 Quality Level 的 Render Pipeline Asset 也是同一个 URP Asset。最后在打包时勾选 “Include All Shaders” 或者手动把用到的 Shader 加进 Always Included Shaders 列表。5. 进阶技巧让期末作业从“能跑”变成“想多跑两圈”5.1 用 Timeline 做一段开场镜头期末作业如果只是打开就能走老师可能三分钟就关掉了。加一段 15 秒的开场镜头展示场景全貌印象分直接拉满。Unity 2021 的 Timeline 做这个非常方便菜单栏 Window Sequencing Timeline。在场景里新建一个空物体命名为 “OpeningCamera”给它加一个 Cinemachine Virtual Camera。打开 Timeline 窗口选中 OpeningCamera点击 Create。在 Timeline 里添加 Cinemachine Track把 Main Camera 的 Cinemachine Brain 拖进去。添加一个 Cinemachine Shot把 OpeningCamera 的 Virtual Camera 拖进去。再添加一个 Activation Track控制角色的激活状态让角色在镜头结束后才出现。用 Animation Track 或者直接 K 关键帧让 OpeningCamera 从场景一端飞到另一端。这样打开作业时先是一段电影感的镜头然后角色出现玩家开始控制。老师一看就知道你花了心思。5.2 用 ProBuilder 快速修补场景细节ProBuilder 是 Unity 自带的建模工具期末作业场景里缺个台阶、少个栏杆、想加个拱门用 ProBuilder 几分钟就能搞定。菜单栏 Window ProBuilder 打开面板在场景里直接拖拽顶点、边、面像捏橡皮泥一样。做好的模型可以直接在 ProBuilder 里设置材质不用导出再导入。我一般用 ProBuilder 做三件事补地形的缝隙、加一些简单的建筑装饰比如窗框、门框、做碰撞体。ProBuilder 生成的 Mesh 可以直接加 Mesh Collider比手动摆 Box Collider 快得多。5.3 性能优化让作业在老师电脑上流畅跑期末作业最怕的就是在你自己电脑上 60 帧在老师电脑上 15 帧。几个立竿见影的优化手段把场景里所有静态物体建筑、地形、道具的 Static 勾选上然后 Window Rendering Occlusion Culling烘焙遮挡剔除。这样相机看不到的物体不会被渲染。把 Lighting 窗口里的 Auto Generate 关掉手动烘焙一次。实时全局光照很吃性能烘焙成 Lightmap 后运行时几乎不耗性能。树木和草的密度减半。Terrain 的 Paint Trees 里把 Tree Density 从默认的 50 降到 20草从 100 降到 40。视觉上差别不大帧率能翻倍。如果场景里有大量重复物体比如路灯、长椅用 GPU Instancing。在材质球的 Inspector 里勾选 “Enable GPU Instancing”然后确保这些物体用的是同一个材质。5.4 一个我踩过的坑Input System 的版本冲突Unity 2021 默认用的是旧输入系统Input Manager但如果你在 Package Manager 里安装了新的 Input System并且把 Active Input Handling 设成了 “Both” 或 “Input System Package”那么Input.GetAxis会直接报错。期末作业如果用了网上找的代码而代码里写的是旧输入你又装了新输入系统就会翻车。解决Project Settings Player Active Input Handling改成 “Input Manager (Old)”。如果你确实想用新输入系统那就把所有Input.GetAxis改成InputAction的写法但期末作业没必要折腾这个。我一般会在项目开始时就确认这个设置避免做到一半发现输入全失效。这个坑我踩过两次第一次以为是代码写错了查了半天才发现是输入系统冲突。第二次就学乖了新建项目第一件事就是检查 Active Input Handling。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号