上篇已经实现了ECS框架下的IBeginDragHandler
、IDragHandler
、IEndDragHandler
这几个拖动事件,使得可以任意给ECS框架下的UI(2D entity)响应拖动事件。本篇分享下在前篇实现的功能的基础上再实现一个常用的摇杆控制角色移动的功能。
需要注意的一点,目前Unity最新的Entities包是无法纯ECS写代码的,还有很多GameObject和组件无法转成Entity和IComponentData,所以要体验纯ECS写代码,得下载那个很久没更新过的ProjectTiny包,它的Entities版本还停留在0.17阶段。
代码不多,直接上代码:
using Unity.Entities;
using Unity.Mathematics;
using Unity.Tiny.UI;
using wangtal.EventSystem;
using TinyUI;
namespace wangtal.Joystick {
public struct Joystick : IComponentData {
public readonly struct Settings : IComponentData {
// 可拖动的范围,可以大于背景的圆形
public readonly float Radius;
public Settings(float radius) {
Radius = radius;
}
}
public Entity Entity {
get; private set;}
public Entity Knob {
get; private set;}
public Entity Highlight {
get; private set;}
// 拖动距离
public float Distance;
public float2 Direction;
public Joystick(Entity joystickEntity, Entity knob, Entity highlight) {
Entity = joystickEntity;
Knob = knob;
Highlight = highlight;
Distance = 0;
Direction = float2.zero;
}
}
public abstract class JoystickSystem : SystemBase, IBeginDragHandler, IDragHandler, IEndDragHandler
{
// 上上篇实现的ECS下的UI分辨率适配系统-用来实现分辨率变化后,UI大小跟着变
private CanvasScalerSystem canvasScalerSystem;
protected override void OnCreate()
{
base.OnCreate();
RequireSingletonForUpdate