Skip to content

命名空间与程序集

unity-csharp-namespace-assembly-system

先抓住一句话

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.ItemMyGame.Shop.Item,不会打架。

using 的作用只是省略长名字:

c
using MyGame.Inventory;

Item item; // 等价于 MyGame.Inventory.Item item;

注意:using 不是“导入文件”,也不是“添加依赖”。如果程序集没引用成功,写再多 using 也没用。

程序集 assembly

程序集可以理解成“C# 编译后的代码包”,常见形式是 .dll。Unity 里你没有创建 .asmdef 时,普通脚本通常会进默认程序集,比如 Assembly-CSharpEditor 文件夹里的编辑器脚本会进 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 默认只在当前程序集里可见。

参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0