Appearance
命名空间与程序集
先抓住一句话
namespace 管“这个类叫什么全名”,assembly 管“这些代码被编译进哪一包、能引用谁”。
c
using UnityEngine;
namespace MyGame.Player
{
public class PlayerMove : MonoBehaviour
{
public float speed = 5f;
}
}这里 PlayerMove 的完整名字不是单纯的 PlayerMove,而是:
c
MyGame.Player.PlayerMove命名空间 namespace
命名空间像“姓氏”或“地址”。如果你有两个 Item 类,一个是背包物品,一个是商店物品,就可以这样分开:
c
namespace MyGame.Inventory
{
public class Item { }
}
namespace MyGame.Shop
{
public class Item { }
}这样它们的完整名字分别是 MyGame.Inventory.Item 和 MyGame.Shop.Item,不会打架。
using 的作用只是省略长名字:
c
using MyGame.Inventory;
Item item; // 等价于 MyGame.Inventory.Item item;注意:using 不是“导入文件”,也不是“添加依赖”。如果程序集没引用成功,写再多 using 也没用。
程序集 assembly
程序集可以理解成“C# 编译后的代码包”,常见形式是 .dll。Unity 里你没有创建 .asmdef 时,普通脚本通常会进默认程序集,比如 Assembly-CSharp;Editor 文件夹里的编辑器脚本会进 Editor 相关程序集。
项目小的时候,可以先不用急着拆程序集。等代码变多了,再用 .asmdef 把代码拆成:
c
MyGame.Core
MyGame.Combat
MyGame.UI
MyGame.Editor然后通过 asmdef 的 References 控制谁能用谁。比如 UI 可以引用 Core,但 Core 不应该反过来引用 UI。
新手最常见坑
命名空间最好和文件夹结构对应,但 C# 不强制。 Unity 的 MonoBehaviour 脚本,类名通常要和文件名一致,例如 PlayerMove.cs 里放 public class PlayerMove。 报错 “type or namespace name could not be found” 时,可能是少了 using,也可能是 asmdef 没引用对应程序集。 public 类型可以跨程序集访问;internal 默认只在当前程序集里可见。
参考链接