Unity 迷你足球

发布: (2025年12月11日 GMT+8 01:47)
6 min read
原文: Dev.to

Source: Dev.to

1. 场地平面 (Plane)

  • Hierarchy → 右键 → 3D ObjectPlane
  • Inspector 设置:
    • Name: Ground
    • Position: X = 0, Y = 0, Z = 0
    • Scale: X = 2, Y = 1, Z = 3

2. 创建绿色材质

  • Project → 右键 → CreateMaterial
  • Name: GrassMaterial
  • InspectorAlbedo:选择绿色 #2D7A2F
  • 将材质拖拽到 Ground 对象上。

结果: 绿色足球场已完成!

3. 建造围墙

3.1 左墙

  • Hierarchy → 右键 → 3D ObjectCube
  • Inspector
    • Name: WallLeft
    • Position: X = ‑10, Y = 0.5, Z = 0
    • Scale: X = 0.2, Y = 1, Z = 30

3.2 右墙

  • Hierarchy → 右键 → 3D ObjectCube
  • Inspector
    • Name: WallRight
    • Position: X = 10, Y = 0.5, Z = 0
    • Scale: X = 0.2, Y = 1, Z = 30

3.3 背墙(玩家侧)

  • Create CubeName: WallBack
  • Position: X = 0, Y = 0.5, Z = ‑15
  • Scale: X = 20, Y = 1, Z = 0.2

3.4 前墙(对手侧)

  • Create CubeName: WallFront
  • Position: X = 0, Y = 0.5, Z = 15
  • Scale: X = 20, Y = 1, Z = 0.2

3.5 墙体材质

  • Create → MaterialName: WallMaterial
  • Albedo: 选择灰色或红色
  • 将材质应用到四面墙上。

结果: 4 面墙围成的封闭场地!

4. 创建球体

4.1 球体对象

  • Hierarchy3D ObjectSphere
  • Inspector
    • Name: Ball
    • Position: X = 0, Y = 0.5, Z = 0
    • Scale: X = 0.5, Y = 0.5, Z = 0.5

4.2 球体材质

  • Create → MaterialName: BallMaterial
  • Albedo: 白色
  • 将材质应用到 Ball 对象上。

4.3 添加物理

  • 选中 BallInspectorAdd ComponentRigidbody
  • Rigidbody 设置:
    • Mass: 0.5
    • Drag: 0.5
    • Angular Drag: 0.5
    • Use Gravity:

4.4 球体物理材质

  • ProjectCreatePhysics MaterialName: BallPhysics
  • Inspector
    • Dynamic Friction: 0.6
    • Static Friction: 0.6
    • Bounciness: 0.3
    • Friction Combine: Average
    • Bounce Combine: Average
  • 选中 BallRigidbodyMaterial → 指定 BallPhysics

5. 创建玩家(胶囊体)

5.1 添加玩家对象

  • Hierarchy3D ObjectCapsule
  • Inspector
    • Name: Player
    • Position: X = 0, Y = 1, Z = ‑10
    • Scale: X = 1, Y = 1, Z = 1

5.2 玩家材质

  • Create → MaterialName: PlayerMaterial
  • Albedo: 蓝色 #0066FF
  • 将材质应用到 Player 对象上。

5.3 添加物理

  • 选中 PlayerAdd ComponentRigidbody
  • Rigidbody 设置:
    • Mass: 2
    • Drag: 2
    • Angular Drag: 5
    • Use Gravity:
  • Constraints: 冻结 X、Y、Z 轴的旋转。

5.4 调整胶囊碰撞体

  • Player 已自带 Capsule Collider
  • Radius: 0.5
  • Height: 2

结果: 蓝色玩家已就绪!

6. 添加 Tag

6.1 球的 Tag

  1. 选中 Ball 对象。
  2. Inspector 中点击 Tag 下拉框 → Add Tag…+Name: Ball
  3. 保存后重新选中 Ball,将 Tag 设置为 Ball

6.2 玩家 Tag

  • 选中 Player,将 Tag 设置为 Player
  • 若不存在该 Tag,先通过 Add Tag… 创建,名称为 Player

7. 相机设置

  • 选中 Main Camera
  • Transform
    • Position: X = 0, Y = 15, Z = ‑12

7.1 相机脚本 (CameraFollow)

  1. CameraFollow 脚本拖到 Main Camera 上。
  2. 在脚本组件中:
    • Target: 拖入 Player 对象。
    • Offset: X = 0, Y = 15, Z = ‑12
    • Smooth Speed: 5

8. 创建球门

8.1 玩家球门(下方)

  • HierarchyCreate EmptyName: GoalPlayer
  • Position: X = 0, Y = 0, Z = ‑14

GoalPlayer 下创建三个 Cube 对象并指定材质:

  • Create → MaterialName: GoalPostMaterialAlbedo: 白色
  • 将材质应用到三个立方体上。

8.2 对手球门(上方)

  • 复制 GoalPlayer(Ctrl + D)。
  • Rename: GoalAI
  • Position: X = 0, Y = 0, Z = 14

结果: 两个球门已完成!

9. 创建进球触发器

9.1 玩家触发器

  • 选中 GoalPlayer → 右键 → 3D ObjectCube
  • Name: GoalTriggerPlayer
  • Position: X = 0, Y = 1, Z = 0.5
  • Scale: X = 6, Y = 2, Z = 0.5

触发器设置:

  • 添加 Box Collider → 勾选 Is Trigger
  • 禁用 Mesh Renderer(使其不可见)。

9.2 AI 触发器

  • 复制 GoalTriggerPlayer(Ctrl + C)。
  • 选中 GoalAI,粘贴为子对象(Ctrl + V)。
  • Rename: GoalTriggerAI
  • Position: X = 0, Y = 1, Z = ‑0.5

9.3 添加 Tag

  • 创建 Tag GoalPlayerGoalAI(若不存在)。
  • GoalPlayer Tag 赋给 GoalTriggerPlayerGoalAI Tag 赋给 GoalTriggerAI

10. 进球系统脚本

// GoalDetector.cs
using UnityEngine;

public class GoalDetector : MonoBehaviour
{
    private GameManager gameManager;

    void Start()
    {
        gameManager = FindObjectOfType();
    }

    // Add trigger handling logic here...
}
  • GoalDetector 脚本挂到 GoalTriggerPlayer 并勾选 Is Player Goal
  • 再将另一个 GoalDetector 挂到 GoalTriggerAI,保持 Is Player Goal 未勾选。

11. 游戏管理器(计分系统)

// GameManager.cs
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public Text playerScoreText;
    public Text aiScoreText;
    public GameObject ball;

    // Implement scoring logic here...
}
  • 创建一个空的 GameObject,命名为 GameManager
  • GameManager.cs 脚本拖到该对象上。

12. 创建 UI(显示比分)

12.1 Canvas 设置

  • Render Mode: Screen Space – Overlay
  • Canvas Scaler → UI Scale Mode: Scale With Screen Size
  • Reference Resolution: 1920 × 1080

12.2 玩家比分(左上角)

  • Canvas → 右键 → UITextName: PlayerScoreText
  • Rect Transform:
    • Anchor: Top‑Left
    • Pos X: 100, Pos Y: ‑50
    • Width: 200, Height: 100
  • Text component:
    • Text: 0
    • Font Size: 72
    • Alignment: Center
    • Color: 蓝色

12.3 AI 分数(右上角)

  • Canvas → 右键 → UITextName: AIScoreText
  • Rect Transform:
    • Anchor: Top‑Right
    • Pos X: ‑100, Pos Y: ‑50
    • Width: 200, Height: 100
  • Text component:
    • Text: 0
    • Font Size: 72
    • Alignment: Center
    • Color: 红色

12.4 将 UI 绑定到 GameManager

  • 选中 GameManager → 在 Inspector 中分配:
    • Player Score Text: 拖入 PlayerScoreText
    • AI Score Text: 拖入 AIScoreText
    • Ball: 拖入 Ball 对象

测试:

  • 进球后比分是否增加? ✅
  • 球是否会回到中心? ✅
  • 分数是否在屏幕上显示? ✅

13. 保存场景

  • File → Save As… → 为场景起一个合适的名字(例如 GameScene)。

14. 创建主菜单场景

14.1 新建场景

  • File → New Scene

14.2 添加 UI

  • Hierarchy → 右键 → UICanvas

14.3 添加按钮

  • 在 Canvas 下:右键 → UIButton - TextMeshPro(创建 START、EXIT 等按钮)。

14.4 MenuManager 脚本

  • MenuManager 脚本挂到 Canvas 上,并配置按钮功能(START → 加载游戏场景,EXIT → 退出应用)。

15. 构建设置

  • File → Build Settings(Ctrl + Shift + B)
  • 按顺序添加场景:
    1. MainMenu(索引 0)
    2. GameScene(索引 1)

测试: 从 MainMenu 场景运行游戏。

16. 暂停菜单

16.1 暂停 UI

  • 打开 GameSceneHierarchy → 右键 → UICanvas
  • 在 Canvas 下添加一个 Panel(命名为 PausePanel)。
  • PausePanel 下添加 Button(如 RESUME、MENU、RESTART)。

16.2 隐藏 PausePanel

  • 选中 PausePanel,默认将其禁用(取消勾选 GameObject)。

16.3 PauseManager 脚本

  • PauseManager 脚本挂到 Canvas 上。
  • 配置按钮功能:
    • RESUME: PauseManager.ResumeGame()
    • MENU: 加载 MainMenu 场景
    • RESTART: 重新加载当前游戏场景

测试: 游戏进行中按 ESC → 暂停菜单出现。

  • RESUME 继续游戏。
  • MENU 返回主菜单。
  • RESTART 重新开始游戏。
Back to Blog

相关文章

阅读更多 »