一、 前提准备
1.导入框架
2.新创建个文件夹,放我们的艺术资源(摇杆,背景图等图片)
二、配置UI
创建:
1.joypanel里放脚本
2.touch里用来设置触摸范围
需要注意的是:
透明度 改为0不会吃事件 所以为1
设置了锚点 左对齐
3.bk里放摇杆的背景图
4.control里放摇柱
三、UI脚本的实现
知识准备:
1.[RectTransformUtility.ScreenPointToLocalPointInRectangle]鼠标位置转换为UI坐标
public class joystaickpanel : BasePanel
{
//触摸范围的图片
private Image imgtouvhrect;
//摇杆背景的图片
private Image imgbk;
//摇杆的图片
private Image imgcontron;
//摇杆距离背景中心点的最远距离
public float maxl = 40.9f;
void Start()
{
//获得对应ui
imgtouvhrect = GetControl<Image>("imgtouvhrect");
imgbk = GetControl<Image>("imgbk");
imgcontron = GetControl<Image>("imgcontron");
//鼠标抬起 按下 拖拽的监听者 他主要用于控制范围
UIManager.Addcustomeventlistener(imgtouvhrect, EventTriggerType.PointerDown, PointerDown);
UIManager.Addcustomeventlistener(imgtouvhrect, EventTriggerType.PointerUp, PointerUp);
UIManager.Addcustomeventlistener(imgtouvhrect, EventTriggerType.Drag, Drag);
//开始的时候设置背景图为隐藏的
imgbk.gameObject.SetActive(false);
}
private void PointerDown(BaseEventData data)
{
//点下的时候显示
imgbk.gameObject.SetActive(true);
//显示在点击屏幕的位置
Vector2 LocalPos
RectTransformUtility.ScreenPointToLocalPointInRectangle(imgtouvhrect.rectTransform,
(data as PointerEventData).position,
(data as PointerEventData).pressEventCamera,
out LocalPos);
//具体设置位置
imgbk.transform.localPosition = LocalPos;
}
private void PointerUp(BaseEventData data)
{
//回到原点
imgcontron.transform.localPosition = Vector3.zero;
EventCenter.GetInstance().EventTrigger<Vector2>("jostick", Vector2.zero);
}
private void Drag(BaseEventData data)
{
Vector2 LocalPos;
//参数
//你想要改变参数的父对象
//得到当前屏幕的鼠标位置
//ui用的摄像机
//可以得到一个转换来的 相对坐标
RectTransformUtility.ScreenPointToLocalPointInRectangle(imgbk.rectTransform,
(data as PointerEventData).position,
(data as PointerEventData).pressEventCamera,
out LocalPos);
//更新位置
imgcontron.transform.localPosition = LocalPos;
//设置范围
if(LocalPos.magnitude>maxl)
{
imgcontron.transform.localPosition = LocalPos.normalized * maxl;
}
//分发我的摇杆方向
EventCenter.GetInstance().EventTrigger<Vector2>("jostick", LocalPos.normalized);
}
}
四、测试
好了现在可以进行测试了
public class test : MonoBehaviour
{
private Vector3 dir;
void Start()
{
EventCenter.GetInstance().AddEventListener<Vector2>("jostick", checkdirchange);
}
void Update()
{
this.transform.Translate(dir*Time.deltaTime, Space.World);
}
private void checkdirchange(Vector2 dir)
{
this.dir.x = dir.x;
this.dir.z = dir.y;
}
}