核心系统又可以分为引擎级核心系统和玩法设计核心系统两大类。下面按这两层讲清楚关键构成与作用。

引擎级核心系统

负责 “游戏能跑起来、画面 / 物理 / 声音正常”,是所有玩法的基础。

渲染系统(Rendering)

  • 负责 3D/2D 画面生成:模型、贴图、光照、阴影、粒子、后处理( bloom / 抗锯齿) - 决定画面风格、帧率、画质档位

物理系统(Physics)

  • 模拟真实世界规则:重力、碰撞、刚体、关节、布料、流体
  • 典型组件:PhysX、Havok、Bullet;决定 “角色能不能站稳、子弹会不会穿墙”

(详情参见Unity之物理系统

动画系统(Animation)

  • 骨骼动画、状态机、混合树、IK(反向运动)、动画事件
  • 让角色动作自然:走路、攻击、受击、表情

(详情参见Unity核心-动画基础

音频系统(Audio)

  • 3D 声音定位、衰减、混响、音效 / 音乐播放、优先级管理
  • 决定打击感、氛围、空间感

AI 系统(Artificial Intelligence)

  • NPC / 怪物行为:寻路、状态机、感知、战术决策、群体行为
  • 高级如《潜行者 2》A-life:NPC 自主生存、交战、迁徙

资源管理系统(Resource)

  • 加载 / 卸载、内存池、对象池、打包压缩、热更新
  • 决定游戏流畅度与加载速度

(详情参见Unity之资源管理系统

网络系统(Network)

  • 客户端 - 服务器架构、同步 / 异步、帧同步 / 状态同步、防作弊
  • 支撑多人联机、PVP、社交

UI / 输入系统

  • 界面布局、事件响应、手柄 / 键盘 / 触屏适配、焦点管理
  • 决定操作手感与信息传递效率

(详情参见UGUI学习笔记Unity进阶-InputSystem

玩法级核心系统

决定 “玩家玩什么、怎么玩、为什么玩”,直接塑造体验循环。

角色控制系统

角色控制系统包含控制玩家的移动、动画。

角色的移动

控制玩家的移动有两种方式,其一是旧输入系统,另一种是Unity InputSystem新输入系统。

  • 旧输入系统

旧输入系统是依靠按键驱动的,代码直接写死物理按键:

1
2
3
4
5
6
7
void Update()
{
if(Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
Jump();
}
}

Jump() 跳跃方法:

1
2
3
4
5
6
7
8
9
public void Jump()
{
if(!_isGrounded) return;
if(_isJumping) return;

_isJumping = true;

_rb.velocity = new Vector2(_jumpDir * _jumpHorizontalSpeed, _jumpForce);
}
  • 新输入系统

新输入系统中常用Invoke Unity Events来控制玩家移动,直接在Inspector面板选择就可以使用:

1
2
3
4
5
6
7
8
9
public void Jump(InputAction.CallbackContext context)
{
if(!_isGrounded) return;
if(_isJumping) return;

_isJumping = true;

_rb.velocity = new Vector2(_jumpDir * _jumpHorizontalSpeed, _jumpForce);
}

其中,InputAction.CallbackContext context是一个按键的详细信息,里面包含了是否按下、输入值是多少等等信息。

角色的动画

详情参见Unity核心-动画基础

场景系统

场景加载系统

详情参见Unity之资源管理系统-场景的加载

无缝体验系统

如果我们的项目是2D的,很适合用这个方法!我们需要做两件事:

  • 相机跟随+场景切换的传送点
  • 图集打包:防止出现断点

相机跟随+场景切换的传送点

  • 为每一个场景配置一个PolygonCollider2D作为边界
  • CinemachineConfiner动态切换相机限制范围
  • 触发器脚本(MapTransition)要做两件事:
    • 动态切换相机边界
    • 把玩家瞬移到新场景安全位置

图集打包

  • 创建 Asset - 2D - Sprite Library Asset 图集,将要打包的图集拖入Objects for Packing,拖入需要打包的资源,Pack Preview

UI系统

首先要设置:

  • UI Scale Mode:Scale With Screen Size
  • Reference Resolution:1920 x 1080

UI布局

  • 新建一个空物体,下面存放标签。为这个空物体增加Grid Layout Group

UI控制

标签页

制作UI有两种方式:

  • 图像 + 事件触发器:含悬停、按下、抬起、拖拽等事件。
    • 适用场景:背包物品拖拽、技能图标悬停Tips、长按事件

下面这个是切换标签页+置灰的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using UnityEngine;
using UnityEngine.UI;

[SerializeField] private Images[] tabImages; // 标签页
[SerializeField] private GameObject[] pages; // 标签下的具体内容

void Start()
{
ActiveTab(0);
}

public void ActiveTab(int tabNo)
{
for(int i = 0; i < tabImages.Length; i ++)
{
pages[i].SetActive(false);
tabImages[i].color = Color.grey;
}
pages[tabNo].SetActive(true);
tabImages[tabNo].color = Color.white;
}
  • 直接用Button:更简单,支持颜色变换
    • 适用场景:主菜单、确认框、设置界面等常规点击按钮

存档系统

具体参见:存档系统之数据持久化-Json

道具系统

道具布局

想要一个更好看的道具布局界面,可以用以下组件帮助我们:

  • 在背包界面挂载 Grid Layout Group 组件。

  • 在单个槽位上添加 Canvas Group 组件。

详情参见:UGUI-常用组件

对话系统

交互系统

我的个人建议是通过引擎级核心系统来判断知识点掌握情况并加以学习,在实际游戏开发过程中,玩法级核心系统可能涉及的会更多。