看到了论文的第二条:原则(2): 不要在节点或预制体上直接挂与逻辑相关的代码组件。
这个很好理解,如果我们直接在节点or预制体上挂代码组件,代码极难维护,如果我们要搜索哪些代码在哪些地方调用,根本就无法通过搜索查到,如果一个一个节点,一个一个预制体的点开找,这样维护起来非常麻烦, 也不方便资源更新与代码热更。如果不挂载脚本怎么控制对象,不会是用find寻找的把
看到了论文的第二条:原则(2): 不要在节点或预制体上直接挂与逻辑相关的代码组件。
这个很好理解,如果我们直接在节点or预制体上挂代码组件,代码极难维护,如果我们要搜索哪些代码在哪些地方调用,根本就无法通过搜索查到,如果一个一个节点,一个一个预制体的点开找,这样维护起来非常麻烦, 也不方便资源更新与代码热更。如果不挂载脚本怎么控制对象,不会是用find寻找的把
晚上好🌙🌙🌙
本答案参考通义千问
在 Unity 开发中,遵循良好的架构设计原则是非常重要的。你提到的“不要在节点或预制体上直接挂与逻辑相关的代码组件”是一个非常关键的设计原则,它有助于提高代码的可维护性、可扩展性和可测试性。
你可以通过以下方式来控制对象,而不是直接在节点或预制体上挂脚本:
// EnemyManager.cs
public class EnemyManager : MonoBehaviour
{
public List<Enemy> enemies = new List<Enemy>();
void Start()
{
// 从场景中查找所有带有 Enemy 组件的对象
enemies = FindObjectsOfType<Enemy>().ToList();
}
public void SpawnEnemy()
{
// 创建新的敌人的逻辑
}
}
// Enemy.cs
public class Enemy : MonoBehaviour
{
public void Move()
{
// 敌人移动逻辑
}
public void Attack()
{
// 攻击逻辑
}
}
注意:虽然
FindObjectsOfType是一种方法,但在实际项目中应尽量避免频繁使用,建议使用事件系统或依赖注入等方式。
UnityEvent 或自定义事件系统,让不同对象之间可以通信而不直接耦合。// PlayerController.cs
public class PlayerController : MonoBehaviour
{
public static event System.Action OnPlayerAttack;
public void Attack()
{
OnPlayerAttack?.Invoke();
}
}
// EnemyAI.cs
public class EnemyAI : MonoBehaviour
{
void OnEnable()
{
PlayerController.OnPlayerAttack += HandlePlayerAttack;
}
void OnDisable()
{
PlayerController.OnPlayerAttack -= HandlePlayerAttack;
}
void HandlePlayerAttack()
{
// 处理敌人响应玩家攻击的逻辑
}
}
// PlayerManager.cs
public class PlayerManager : MonoBehaviour
{
public Player player;
void Start()
{
player = FindObjectOfType<Player>();
if (player != null)
{
player.OnAttack += HandlePlayerAttack;
}
}
void HandlePlayerAttack()
{
// 响应玩家攻击
}
}
{
"enemies": [
{
"type": "Goblin",
"health": 100,
"speed": 2.5f
},
{
"type": "Orc",
"health": 200,
"speed": 1.8f
}
]
}
| 方法 | 优点 | 适用场景 | |------|------|----------| | 组件系统 + 管理器 | 易于维护、结构清晰 | 中小型项目 | | 事件系统 | 解耦逻辑、便于扩展 | 跨对象通信 | | 依赖注入 | 提高灵活性、降低耦合 | 复杂交互逻辑 | | 配置文件 / 数据驱动 | 易于调整、支持热更 | 动态行为控制 | | ECS 架构 | 高性能、适合大规模 | 大型项目、高性能需求 |
如有具体项目结构或功能需求,也可以进一步讨论如何设计架构。