我们首先在unity中新建一个c#文件,这是最基本的样式:如下图

一.using命名空间
using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句
using UnityEngine是- 命名空间声明(Namespace declaration),相当于C语言的include或者前端的import,总之就是导包,导入unity所需要的包,术语是【导入命名空间】
二. MonoBehaviour
unity中新创建的脚本会默认继承MonoBehaviour类
静态变量
静态变量 :关键字static。 静态变量的核心特点
-
全局唯一性
静态变量属于类本身,而非类的实例。无论创建多少个实例,静态变量只有一份拷贝。
-
内存常驻
静态变量在程序启动时初始化,生命周期持续到程序结束,因此可跨场景保留数据。
-
直接访问
无需创建实例,可通过类名直接访问(如
ClassName.StaticVariable
)。静态变量在 Unity 中是一把双刃剑:
✅ 优点 :简化全局访问、跨场景数据传递、减少实例开销。
❌ 缺点:内存管理风险、耦合度高、测试困难。
三. public
在 Unity 中,public
是一个访问修饰符,主要用于控制类成员(变量、方法、属性等)的可见性和可访问性。它在 Unity 开发中有以下核心作用:
1. 在 Inspector 面板中显示变量
Unity 会自动将 public
变量暴露在 Inspector 面板中,允许开发者在编辑器中直接配置数值,无需修改代码。这对于调整游戏参数(如速度、生命值、引用对象等)非常方便。
2. 允许其他脚本访问和修改
public
成员可以被同一项目中的其他类直接访问,这是组件间通信的基础。
``
csharp
// 脚本A:定义公共变量
public class HealthSystem : MonoBehaviour {
public int currentHealth = 100;
public void TakeDamage(int amount) {
currentHealth -= amount;
} }
// 脚本B:访问脚本A的公共变量和方法
public class EnemyAttack : MonoBehaviour {
public HealthSystem targetHealth;// 在Inspector中赋值
public void Attack() {
targetHealth.TakeDamage(20);// 直接调用公共方法
Debug.Log("Target health: " + targetHealth.currentHealth);// 直接访问公共变量 } }
3. 定义类的公共接口
通过 public
方法和属性,可以明确类的外部可调用 API,隐藏内部实现细节。
csharp
public class AudioManager : MonoBehaviour {
// 私有字段:内部实现细节
private AudioSource musicSource;
// 公共属性:外部访问的接口
public float Volume {
get { return musicSource.volume; }
set { musicSource.volume = Mathf.Clamp(value, 0f, 1f);
}
}
// 公共方法:外部可调用的功能 public void PlayMusic(AudioClip clip) {
musicSource.clip = clip;
musicSource.Play();
} }
4. 序列化非公共变量 (常用)
若希望非 public
变量也在 Inspector 中显示,可使用 [SerializeField]
属性,但 public
变量无需此属性。
csharp
public class Example : MonoBehaviour {
[SerializeField]
private int privateValue; // 私有变量,但在Inspector中可见
public int publicValue; // 公共变量,默认在Inspector中可见
}
5. 与继承结合使用
public
成员可被派生类继承和重写(需配合 virtual
和 override
关键字)。
csharp
public class Animal : MonoBehaviour {
public virtual void MakeSound()
// 公共虚方法 { Debug.Log("Animal sound");
}
}
public class Dog : Animal
{
public override void MakeSound() // 重写公共方法 {
Debug.Log("Woof!");
}
}
使用注意事项
-
谨慎暴露敏感数据
避免将需要保护的内部状态设为
public
(如密码、游戏逻辑核心变量),建议使用private
配合public
属性访问。 -
性能考虑
频繁访问
public
变量可能比访问局部变量稍慢(涉及反射),但在大多数情况下可忽略不计。 -
替代方案
- 若只需在 Inspector 中显示,无需外部访问,可使用
[SerializeField] private
。 - 若需外部访问但不想暴露在 Inspector 中,可使用
private
配合public
属性。
- 若只需在 Inspector 中显示,无需外部访问,可使用
总结
public
在 Unity 中的核心价值是:
-
可视化配置:通过 Inspector 面板快速调整参数。
-
组件通信:实现不同脚本间的数据传递和方法调用。
-
接口设计:定义类的公共 API,封装内部实现。
合理使用 public
可以提高开发效率,但需注意控制访问范围,遵循面向对象的封装原则。
四. 静态变量和实例变量的区别

csharp
public class Player
{
// 静态变量:所有玩家共享同一分数
public static int TotalPlayers = 0;
// 实例变量:每个玩家有自己的生命值
public int Health = 100;
public Player()
{
TotalPlayers++; // 每次创建玩家时增加总数
}
}
五. static和public的区别

csharp
public class Player {
// 静态变量:所有玩家共享同一分数
public static int TotalPlayers = 0;
// 实例变量:每个玩家有自己的生命值
public int Health = 100;
public Player() {
TotalPlayers++; // 每次创建玩家时增加总数
}
}
// 使用示例
public class GameManager {
public void StartGame() {
Player p1 = new Player();
Player p2 = new Player();
Debug.Log(Player.TotalPlayers); // 输出:2(所有玩家共享)
Debug.Log(p1.Health); // 输出:100(实例独立)
p1.Health = 80;
Debug.Log(p2.Health); // 输出:100(p2的Health不受影响)
} }
在 Unity 中的典型应用场景
static 的常见用途
- 全局管理器 :实现单例模式(如
AudioManager.Instance
)。 - 工具方法 :无需实例化的辅助函数(如
Mathf.Clamp()
)。 - 跨场景数据 :静态变量可在场景切换时保留数据(如
GameState.Level
)。
public 的常见用途
- Inspector 暴露 :让变量在 Unity 编辑器中可见,便于配置(如
public GameObject target
)。 - 组件通信:允许其他脚本访问和修改当前实例的属性。
- 接口设计:定义类的公共 API,供外部调用。
特殊注意事项
-
public 静态变量在 Inspector 中的行为
- Unity 会为每个脚本实例显示一个静态变量的副本,但修改任何一个都会影响全局值(易混淆,不推荐这样用)。
-
静态引用 MonoBehaviour 组件
- 静态变量若引用 MonoBehaviour 组件(如
GameObject
),需确保在使用前已正确初始化,否则可能导致空引用。
- 静态变量若引用 MonoBehaviour 组件(如
-
内存管理
- 静态变量不会被垃圾回收,过度使用可能导致内存泄漏。
总结
-
static 解决的是 "属于类还是实例" 的问题,强调共享性和全局访问。
-
public 解决的是 "能否被外部访问" 的问题,与是否静态无关。
两者可组合使用(如 public static
),但功能相互独立。合理搭配这两个修饰符,可以实现灵活的代码架构和组件交互。