千峰教育 -Unity游戏开发(二期)课--itazs.fun/17082/
以下是Unity从入门到实战的5个经典案例拆解,涵盖2D、3D和VR开发的核心技术点,包含可复用的代码模板和实现原理图解:
案例1:2D平台跳跃游戏(类马里奥)
核心组件
graph TB
A[PlayerController] --> B[刚体2D]
A --> C[碰撞器2D]
D[关卡设计] --> E[瓦片地图]
D --> F[可收集物品]
关键代码
// 角色移动与跳跃
public class PlayerController : MonoBehaviour {
[SerializeField] float moveSpeed = 5f;
[SerializeField] float jumpForce = 10f;
private Rigidbody2D rb;
private bool isGrounded;
void Update() {
float moveX = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(moveX * moveSpeed, rb.velocity.y);
if(Input.GetButtonDown("Jump") && isGrounded){
rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
void OnCollisionEnter2D(Collision2D col) {
if(col.contacts[0].normal.y > 0.7f)
isGrounded = true;
}
}
技术要点
- 瓦片地图绘制技巧(规则瓦片/随机瓦片)
- 二段跳实现:
if(jumpCount < 2) { Jump(); jumpCount++; } - 斜坡物理材质设置(摩擦力调整)
案例2:3D角色控制器(第一人称/第三人称)
实现方案对比
| 控制方式 | 核心API | 适用场景 |
|---|---|---|
| 第一人称 | Transform.Translate | 射击游戏 |
| 第三人称 | CharacterController | RPG游戏 |
| 物理驱动 | Rigidbody.AddForce | 拟真场景 |
第三人称代码
public class ThirdPersonController : MonoBehaviour {
[SerializeField] float speed = 5f;
[SerializeField] float turnSmoothTime = 0.1f;
private CharacterController controller;
private float turnSmoothVelocity;
void Update() {
Vector3 direction = new Vector3(
Input.GetAxisRaw("Horizontal"),
0,
Input.GetAxisRaw("Vertical")).normalized;
if(direction.magnitude >= 0.1f) {
float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
float angle = Mathf.SmoothDampAngle(
transform.eulerAngles.y,
targetAngle,
ref turnSmoothVelocity,
turnSmoothTime);
transform.rotation = Quaternion.Euler(0f, angle, 0f);
controller.Move(direction * speed * Time.deltaTime);
}
}
}
高级功能
- 相机跟随:
Cinemachine FreeLook组件 - 攀爬系统:射线检测+动画状态机
- 战斗连招:动画事件绑定
案例3:VR交互(Oculus Quest)
技术栈
graph LR
A[XR Interaction Toolkit] --> B[手柄射线交互]
A --> C[抓取物理]
D[UI适配] --> E[Canvas World Space]
抓取物品实现
public class VRGrabbable : XRGrabInteractable {
protected override void OnSelectEntered(XRBaseInteractor interactor) {
base.OnSelectEntered(interactor);
// 禁用物理防止穿模
GetComponent<Rigidbody>().isKinematic = true;
}
protected override void OnSelectExited(XRBaseInteractor interactor) {
base.OnSelectExited(interactor);
// 恢复物理
GetComponent<Rigidbody>().isKinematic = false;
}
}
优化技巧
- 手柄震动反馈:
inputDevice.SendHapticImpulse() - 性能优化:OVRManager固定注视点渲染
- 防眩晕设计:瞬移移动方案
案例4:2D物理拼图游戏
核心机制
// 拼图碎片吸附
void OnMouseUp() {
Collider2D[] hits = Physics2D.OverlapCircleAll(transform.position, 0.5f);
foreach(var hit in hits) {
if(hit.CompareTag("TargetSlot")) {
transform.position = hit.transform.position;
GetComponent<Collider2D>().enabled = false;
}
}
}
编辑器技巧
- Sprite分割:
Sprite Editor > Slice - 关卡设计:
ScriptableObject存储关卡数据 - 粒子效果:完成时触发
ParticleSystem.Play()
案例5:3D塔防游戏
核心架构
classDiagram
class Tower{
+float damage
+float attackRate
+Attack()
}
class Enemy{
+float health
+Move()
}
class WaveManager{
+SpawnWave()
}
寻路实现
// NavMeshAgent简单控制
public class Enemy : MonoBehaviour {
private NavMeshAgent agent;
void Start() {
agent = GetComponent<NavMeshAgent>();
agent.SetDestination(GameManager.Instance.basePosition);
}
void Update() {
if(agent.remainingDistance < 0.5f) {
AttackBase();
}
}
}
学习路线图
timeline
title Unity进阶路径
第1周 : 掌握C#基础语法
第2周 : 完成2D平台案例
第3周 : 实现3D角色控制
第4周 : 开发VR交互原型
第6周 : 发布完整游戏项目
性能优化清单
- 批处理设置:
Edit > Project Settings > Graphics - 物理优化:
Physics.autoSimulation = false - 内存管理:
Resources.UnloadUnusedAssets()
项目资源: