日期:2023-8-1
中午一个粉丝留言问,Ui 如何通信呢?
回家洗完澡 想起来了,我写一下。
首先,通信是通过事件的形式,然后通过外观模式来设计。
事件涉及到注册,那么如何拿到被注册的对象呢?
我们ECS中的S,是指System,一般继承自SystemBase、ISystem
如何在外部,拿到控制器呢?
先写一个概念(博主自己的命名,不是官方),
外部,我们称为Mono,内部我们称为ECS
首先,
1,我们建立ECS的外观类,
ECS_Facade,书写如下
重点啊,继承自SystemBase
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
public partial class ECS_Facade : SystemBase
{
public void GamePause()
{
Debug.Log("ECS Pause");
// EntityManager logic
}
public void GameRestart()
{
Debug.Log("ECS Restart");
// EntityManager logic
}
protected override void OnUpdate()
{
}
}
2,我们建立Mono的外观类
Mono_Facade
using UnityEngine;
using Unity.Entities;
using System;
public class Mono_Facade : MonoBehaviour
{
public Action GamePause;
public Action GameRestart;
// Start is called before the first frame update
void Start()
{
ECS_Facade ecsFacade = World.DefaultGameObjectInjectionWorld.GetExistingSystemManaged<ECS_Facade>() ;
GamePause = ecsFacade.GamePause;
GameRestart = ecsFacade.GameRestart;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
GamePause?.Invoke();
}
if (Input.GetKeyDown(KeyCode.R))
{
GameRestart?.Invoke();
}
}
}
3,细节备注
ECS中的System,运行在一个World的概念中,
所以,通过 World.GetExistingSystemManaged 获取 System
我们再看下,为什么非要继承自 SystemBase,
一看泛型约束,以及System的继承,便懂了吧?
4,作者的话
我每篇博客,开头第一件事,写日期。
Dots是一个更新很快的体系,我也推荐大家用较新的版本 去学习、开发。
在2022.3 LTS 版本中,Unity推出了 Dots1.0 ,才算是正式版,
不要再去学 0.5 pre 什么的开发中版本了,功能不稳定,概念、API 也都在变。
Dots1.0 也提供了更人性化的Bake系统、更方便的编辑器工具。