How to Develop a Game
Scripts
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

Unity脚本就是你编写的C#类,它控制游戏中物体的行为、交互、动画、输入、碰撞、UI等逻辑

脚本类型

Unity中的脚本根据其用途可以分为3类:

特性MonoBehaviourScriptableObject纯 C# 类
是否可挂载可以挂载到 GameObject不行不行
生命周期函数StartUpdate没有没有
是否能序列化支持支持默认不支持
支持协程StartCoroutine()不支持不支持
使用场景行为脚本,控制对象数据容器,可复用资源配置工具类、算法类等逻辑单元
  1. MonoBehaviour(行为脚本)

适用场景

  1. 角色控制器(移动、跳跃、攻击)

  2. UI交互逻辑

  3. 游戏状态管理

  4. 物理交互处理

  5. 动画状态控制

  6. ScriptableObject(数据容器)

核心优势

  1. 纯C#类(工具类)

适用场景

  1. 实现复杂算法
  2. 数据模型定义
  3. 工具类库
  4. 设计模式实现

优化技巧

// 使用partial类拆分大型工具类
public partial class MathUtility
{
  public static Vector3 CalculateBazierPoint(...){ ... }
}
public partial class MathUtility
{
  public static Quaternion SmoothDampRoatation(...){ ... }
}

// 使用扩展方法增强现有功能
public staitc class TransformExtensions
{
  public static void Reset(this Transform transform)
  {
    transform.position = Vector3.zero;
    transform.rotation = Quaternion.identity;
    transform.localScale = Vector3.one;
  }
}

变量声明

在Unity C#脚本中,变量声明是定义数据存储位置的基本方式。变量可以存储各种类型的数据,如数字、文本、布尔值、引用游戏对象等

基本语法\

[访问修饰符] [数据类型] [变量名] [= 初始值]

访问修饰符\

修饰符Inspector 可见其他脚本可访问用途
public可见可访问对外公开变量(慎用)
private不可见(默认)不可访问仅类内部使用
[SerializeField] private可见不可访问私有但可在 Inspector 编辑
public int score = 9; // 可见且可访问
private float health = 100f; // 完全私有
[SerializeField] private float moveSpeed = 5f; // Inspector可见但外部不可改

数据类型\

变量特性
Attribute in Unity

脚本间通信(引用其他组件)

Unity Component Communication

基类: MonoBehaviour

MonoBehaviour

ScriptableObject(数据驱动)

ScriptableObject

变量管理策略

序列化控制

// 条件序列化
[SerializeField]
private bool useAdvancedSettings;
[SerializeField, ShowIf("useAdvancedSettings")]
private float advancedParameter;

// 多态序列化
[SerializeReference]
public IWeapon currentWeapon; // 可序列化接口

组织技巧

[System.Serializable]
public class CharacterStats
{
  public float health;
  public float stamina;
  public float attackPower;
}

public class Player : MonoBehaviour
{
  [BoxGroup("基础属性")]
  public CharacterStats baseStats;

  [BoxGroup("成长属性")]
  public CharacterStats growthStats;
}

性能优化

  1. 缓存组件引用
private Rigidbody = _rb;
void Awake() => _rb = GetComponent<Rigidbody>();
  1. 避免频繁GetComponent
// 错误做法:每帧调用
void Update() => GetComponent<Rigidbody>().AddForce(...);

// 正确做法
private Rigidbody _rb;
void Awake() => _rb = GetComponent<Rigidbody>();
void Update() => _rb.AddForce(...);
  1. 使用ObjectPool管理频繁创建/销毁的对象 Object Pooling

  2. 合理使用Update方法

// 低频更新示例
private float _nextUpdateTime;
void Update()
{
  if (Time.time < _nextUpdateTime) return;
  _nextUpdateTime = Time.time + 0.5f;
  // 每0.5秒执行一次的逻辑
}

架构设计建议

  1. 事件驱动架构
public static class GameEvents
{
  public static event Action OnPlayerDeath;
  public static event Action<int> OnScoreChanged;

  public static void TriggerPlayerDeath() => OnPlayerDeath?.Invoke();
}
  1. 组件化设计
// 将功能拆分为独立组件
[RequireComponent(typeof(HealthSystem))]
public class Damageable : MonoBehaviour
{
  private HealthSystem _health;
  void Awake() => _health = GetComponent<HealthSystem>();

  public void TakeDamage(float amount) => _health.Reduce(amount);
}
  1. 状态模式应用
public interface IPlayerState
{
  void Enter(PlayerController player);
  void Update();
  void Exit();
}

public class JumpState : IPlayerState { ... }
public class AttackState : IPlayerState { ... }

调试与测试

  1. 自定义调试工具
#if UNITY_EDITOR
[Header{"Debug"}]
[SerializaField] private bool _showDebugInfo;
[SerializeField, ShowIf("_showDebugInfo")]
private Color _debugColor = Color.red;

void OnDrawGizmos()
{
  if(!_showDebugInfo) return;
  Gizmos.color = _debugColor;
  Gizmos.DrawWireSphere(transform.position, 2f);
}
#endif
  1. 单元测试示例
#if UNITY_EDITOR
using NUnit.Framework;

public class MathTests
{
  [Test]
  public void VectorAngleTest()
  {
    var v1 = new Vector2(1, 0);
    var v2 = new Vector2(0, 1);
    Assert.AreEqual(90, Vector2.Angle(v1, v2));
  }
}
#endif

版本兼容性处理

// API版本检查
#if UNITY_2020_1_OR_NEWER

  // 使用新API
  transform.hasChanged = false;

#else

  // 兼容旧版本的替代方法
  StartCoroutine(CheckTransformChange());
#endif

Unity命名空间

1.UnityEngine

2.UnityEngine.UI

用于构建游戏界面,处理用户交互。

3.UnityEngine.SceneManagement

4.UnityEngine.Audio

处理声音播放和混音控制。

5.UnityEngine.EventSystem

UI 交互和自定义输入处理常用。

6.UnityEngine.Animation

用于角色动画控制和状态机管理。

7.UnityEditor(仅编辑器)

只能在编辑器环境使用,构建后不包含

8.Unity.Collections / Unity.Jobs / Unity.Burst

DOTS(Data-Oriented Technology Stack)架构核心。

官方文档

Unity脚本的最佳实践

  1. 变量封装
  1. 合理命名
  1. Inspector优化
  1. 性能考虑
  1. 解耦逻辑