在 Unity 游戏开发中,人物移动、相机跟随以及 UI 事件处理是构建游戏体验的三大基石。本文将深入探讨这三个关键领域,并提供详细的代码示例,帮助开发者更好地掌握 Unity 游戏开发。
人物移动:刚体与 CharacterController 的选择
人物移动通常有两种实现方式:基于刚体(Rigidbody)和基于角色控制器(CharacterController)。
基于刚体(Rigidbody):
Rigidbody 提供真实的物理模拟,适用于需要物理碰撞和交互的游戏,例如:射击类游戏中的子弹运动。
using UnityEngine; public class PlayerMovementRigidbody : MonoBehaviour { public float moveSpeed = 5f; // 移动速度 public Rigidbody rb; // Rigidbody 组件 void FixedUpdate() { float horizontalInput = Input.GetAxis("Horizontal"); // 获取水平方向输入 float verticalInput = Input.GetAxis("Vertical"); // 获取垂直方向输入 Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput) * moveSpeed * Time.fixedDeltaTime; // 计算移动向量 rb.MovePosition(rb.position + movement); // 使用 MovePosition 进行移动,避免穿墙 } }基于角色控制器(CharacterController):

CharacterController 专为人物控制设计,提供更精确的碰撞检测和运动控制,避免穿墙等问题,适用于大多数第三人称或第一人称游戏。
using UnityEngine; public class PlayerMovementController : MonoBehaviour { public float moveSpeed = 5f; // 移动速度 public CharacterController controller; // CharacterController 组件 public float gravity = -9.81f; // 重力 private Vector3 velocity; // 存储垂直方向速度 void Update() { float horizontalInput = Input.GetAxis("Horizontal"); // 获取水平方向输入 float verticalInput = Input.GetAxis("Vertical"); // 获取垂直方向输入 Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput).normalized; // 归一化向量,防止斜向移动速度过快 movement = transform.TransformDirection(movement); // 将本地坐标转换为世界坐标 movement *= moveSpeed * Time.deltaTime; // 计算移动向量 // 模拟重力 velocity.y += gravity * Time.deltaTime; // 移动角色 controller.Move(movement + velocity * Time.deltaTime); // 当角色落地时,重置垂直速度 if (controller.isGrounded) { velocity.y = -2f; } } }
避坑经验: 使用 Rigidbody 时,注意调整 Interpolate 属性为 Interpolate 或 Extrapolate,以平滑运动。使用 CharacterController 时,需要手动模拟重力,并处理跳跃等逻辑。
相机移动:跟随与操控
相机移动是影响玩家视角的重要因素,常见的有跟随模式和自由操控模式。
跟随模式:

相机始终跟随人物,保持相对位置不变。
using UnityEngine; public class CameraFollow : MonoBehaviour { public Transform target; // 目标对象(人物) public Vector3 offset; // 相机与目标的偏移量 public float smoothSpeed = 0.125f; // 平滑速度 void LateUpdate() { Vector3 desiredPosition = target.position + offset; // 计算目标位置 Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); // 平滑过渡 transform.position = smoothedPosition; // 设置相机位置 transform.LookAt(target); // 始终看向目标 } }自由操控模式:
允许玩家通过鼠标或键盘控制相机旋转和缩放。
using UnityEngine; public class CameraControl : MonoBehaviour { public float rotateSpeed = 5f; // 旋转速度 public float zoomSpeed = 1f; // 缩放速度 void Update() { // 旋转 if (Input.GetMouseButton(1)) // 按住鼠标右键旋转 { float mouseX = Input.GetAxis("Mouse X") * rotateSpeed; transform.Rotate(Vector3.up, mouseX); } // 缩放 float scroll = Input.GetAxis("Mouse ScrollWheel"); transform.Translate(Vector3.forward * scroll * zoomSpeed); } }
避坑经验: 相机跟随的平滑速度 smoothSpeed 需根据游戏风格调整,过大会导致迟滞感,过小会显得生硬。自由操控模式下,需要限制相机的旋转角度,避免穿透场景。
UI 事件处理:Button、Slider 和 InputField
UI 事件处理是游戏交互的重要组成部分,Unity 提供了完善的 UI 系统。
Button:
按钮点击事件。
using UnityEngine; using UnityEngine.UI; public class ButtonClickHandler : MonoBehaviour { public Button myButton; // Button 组件 void Start() { myButton.onClick.AddListener(TaskOnClick); // 添加点击事件监听器 } void TaskOnClick() { Debug.Log("Button clicked!"); // 点击后输出日志 } }Slider:

滑动条数值改变事件。
using UnityEngine; using UnityEngine.UI; public class SliderValueChangeHandler : MonoBehaviour { public Slider mySlider; // Slider 组件 public Text valueText; // 显示 Slider 值的 Text 组件 void Start() { mySlider.onValueChanged.AddListener(delegate { ValueChangeCheck(); }); // 添加数值改变事件监听器 } public void ValueChangeCheck() { valueText.text = "Slider Value: " + mySlider.value; // 更新 Text 显示 } }InputField:
输入框内容改变事件。
using UnityEngine; using UnityEngine.UI; public class InputFieldValueChangeHandler : MonoBehaviour { public InputField myInputField; // InputField 组件 public Text inputText; // 显示输入内容的 Text 组件 void Start() { myInputField.onValueChanged.AddListener(delegate { ValueChangeCheck(); }); // 添加内容改变事件监听器 } public void ValueChangeCheck() { inputText.text = "Input Field Value: " + myInputField.text; // 更新 Text 显示 } }
避坑经验: UI 事件需要在 Inspector 面板中关联对应的 GameObject 和函数。对于复杂的 UI 交互,可以使用 Unity 的 Event System 进行统一管理。
总结
本文详细介绍了 Unity 游戏开发中人物移动、相机移动和 UI 事件处理的实现方式和注意事项。通过学习这些基础知识,开发者可以构建更流畅、更具交互性的游戏体验。希望这篇文章能帮助你更好地掌握 Unity 游戏基础,提升游戏开发技能。
冠军资讯
脱发程序员