千峰教育 -Unity游戏开发(二期)课程

100 阅读2分钟

4fb78a5dc3654c8ea4f4d1f6a17b18f0~tplv-obj.jpg

千峰教育 -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射击游戏
第三人称CharacterControllerRPG游戏
物理驱动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周 : 发布完整游戏项目

性能优化清单

  1. 批处理设置:Edit > Project Settings > Graphics
  2. 物理优化:Physics.autoSimulation = false
  3. 内存管理:Resources.UnloadUnusedAssets()

项目资源