找回密码
 注册帐号

扫一扫,访问微社区

菠萝哥哥 游戏开发 之 MMORPG摇杆功能 - lua

126
回复
5033
查看
  [ 复制链接 ]
排名
634
昨日变化

18

主题

331

帖子

2308

积分

Rank: 9Rank: 9Rank: 9

UID
13110
好友
12
蛮牛币
4896
威望
0
注册时间
2014-1-21
在线时间
596 小时
最后登录
2019-4-1

专栏作家认证开发者

2018-7-20 10:54:12 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 菠萝哥哥 于 2018-7-23 18:51 编辑
因为游戏需要热更新,所以要用Lua实现功能,这就很蛋疼(ToLua)

]5K{8E8AEB(7Q{5{9NX)RUE.png
界面 - 摇杆是不固定位置的

yaogan2.png

目录结构
m_ResponseRegion_btn  在区域内点击 摇杆底盘会飞到点击位置 继续拖拽
m_Direction_btn              是底盘

m_Ride_btn                     摇杆   还要支持点击上马功能

2.png

策略就是 c#只负责发送事件 ,lua接受事件 并做逻辑处理.

c# 方面
m_ResponseRegion_btn 绑定 UIJoystackArea.cs 脚本
[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

namespace UISystem
{
    public class UIJoystackArea : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
    {
        public UIJoystack m_UIJoystack;

        public void OnDrag(PointerEventData data)
        {
            m_UIJoystack.OnDrag(data);
        }

        public void OnPointerUp(PointerEventData data)
        {
            m_UIJoystack.OnPointerUp2(data);
        }

        public void OnPointerDown(PointerEventData data)
        {
            m_UIJoystack.OnPointerDown2(data,this.gameObject);
        }
    }
}



m_Ride_btn   绑定  UIJoystack.cs 脚本
游客,如果您要查看本帖隐藏内容请回复




c# 发送事件后 lua方面

[Golang] 纯文本查看 复制代码
using UnityEngine;
using UnityEngine.EventSystems;

namespace UISystem
{
    public class UIJoystack :  MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IDragHandler, IEndDragHandler, IBeginDragHandler
    {
        private const string UI_EVENT_JOYSTACK_ON_DRAGING = "UI_EVENT_JOYSTACK_ON_DRAGING";
        private const string UI_EVENT_JOYSTACK_BEGIN_DRAG = "UI_EVENT_JOYSTACK_BEGIN_DRAG";
        private const string UI_EVENT_JOYSTACK_END_DRAG = "UI_EVENT_JOYSTACK_END_DRAG";
        private const string UI_EVENT_JOYSTACK_Click = "UI_EVENT_JOYSTACK_Click";

        //底盘初始位置
        private Vector2 BoderInitialPos;
        //底盘半径
        public float Raidus = 0.0f;
        //底盘
        public RectTransform boder;

        //拖动数据
        private Vector2 _dragdata;         

        //摇杆初始位置
        private Vector3 OriginPos;

        public Vector3 Dir;
        //事件
        public delegate void OnEventHandler(string eventId, float x, float y, float z);
        public OnEventHandler onJoystackEventHandler = null;

        private bool isDrag = false;
        private bool isClick = true;

        public void SetEventHandler(OnEventHandler handler)
        {
            onJoystackEventHandler = handler;
        }

        private void SendEvent(string eventID, Vector3 dir)
        {
            if (this.onJoystackEventHandler != null)
            {
                this.onJoystackEventHandler(eventID, dir.x, dir.y, dir.z);
            }
        }

        public void Start()
        {
            OriginPos = transform.localPosition;
            Raidus = boder.sizeDelta.x / 2;
            BoderInitialPos = boder.localPosition;
        }

        public void OnDisable()
        {
            transform.localPosition = OriginPos;
            Dir = Vector3.zero;
            if (isDrag)
            {
                SendEvent("UI_EVENT_JOYSTACK_END_DRAG", Dir);
            }
        }

        /// <summary>
        /// 拖动
        /// </summary>
        /// <param name="data"></param>
        public void OnDrag(PointerEventData data)
        {
            isClick = false;
            _dragdata += data.delta;
            Drag(_dragdata);
            SendEvent("UI_EVENT_JOYSTACK_ON_DRAGING", Dir);
        }

        public void Drag(Vector2 data)
        {
            transform.localPosition = OriginPos + new Vector3(data.x, data.y, 0);
            var distance = Vector3.Distance(transform.localPosition, OriginPos);
            if (distance > Raidus)
            {
                transform.localPosition = Vector3.Lerp(OriginPos, transform.localPosition, Raidus / distance);
            }
            Dir = (transform.localPosition - OriginPos).normalized;
        }

        /// <summary>
        /// 摇杆被点击
        /// </summary>
        /// <param name="data"></param>
        public void OnPointerClick(PointerEventData data)
        {
            if (isClick == false)
            {
                return;
            }
            Dir = Vector3.zero;
            //SendEvent("UI_EVENT_JOYSTACK_END_DRAG", Dir);
            SendEvent(UI_EVENT_JOYSTACK_Click, Dir);          
        }

        /// <summary>
        /// 底盘位移按下-开始拖动
        /// </summary>
        /// <param name="data"></param>
        public void OnPointerDown2(PointerEventData data,GameObject go)
        {
            isDrag = true;
            _dragdata = Vector2.zero;
     
            Vector2 pos;
            if (RectTransformUtility.ScreenPointToLocalPointInRectangle(go.transform as RectTransform,
                data.position, data.pressEventCamera, out pos))
            {
                boder.localPosition = pos;
            }
            SendEvent("UI_EVENT_JOYSTACK_BEGIN_DRAG", Dir);
        }

        /// <summary>
        /// 开始拖动
        /// </summary>
        /// <param name="data"></param>
        public void OnPointerDown(PointerEventData data)
        {
            //isDrag = true;
            //_dragdata = Vector2.zero;
            //SendEvent("UI_EVENT_JOYSTACK_BEGIN_DRAG", Dir);
        }

        /// <summary>
        /// 底盘位移抬起
        /// </summary>
        /// <param name="eventData"></param>
        public void OnPointerUp2(PointerEventData eventData)
        {
            //Debug.LogError("1 - OnPointerUp");
            boder.gameObject.transform.localPosition = BoderInitialPos;
            transform.localPosition = OriginPos;
            isDrag = false;
            isClick = true;
            SendEvent("UI_EVENT_JOYSTACK_END_DRAG", Dir);
        }

        /// <summary>
        /// 结束拖动
        /// </summary>
        /// <param name="eventData"></param>
        public void OnEndDrag(PointerEventData data)
        {
            //Debug.LogError("2 - OnEndDrag");
            transform.localPosition = OriginPos;
            isDrag = false;
            isClick = true;
            SendEvent("UI_EVENT_JOYSTACK_END_DRAG", Dir)
        }

        public void OnBeginDrag(PointerEventData data)
        {
            //transform.localPosition = OriginPos;
            isDrag = true;
            isClick = false;
            _dragdata = Vector2.zero;
            SendEvent("UI_EVENT_JOYSTACK_BEGIN_DRAG", Dir);
        }

    }
}



事件调用4个方法
[Golang] 纯文本查看 复制代码
local JoyEventHandler =
{
    ["UI_EVENT_JOYSTACK_BEGIN_DRAG"] = UIMainPanel_m_JoyStack_BeginDrag,  //开始拖动
    ["UI_EVENT_JOYSTACK_ON_DRAGING"] = UIMainPanel_m_JoyStack_Draging,    
    ["UI_EVENT_JOYSTACK_END_DRAG"] = UIMainPanel_m_JoyStack_EndDrag,     //停止拖动   
    ["UI_EVENT_JOYSTACK_Click"] = UIMainPanel_PlayerMount,                 //点击上马
}

function UIMainPanel_Controller_JoyStackEvent(eventID,x , y, z)
    if JoyEventHandler[eventID] ~= nil then
        JoyEventHandler[eventID](x,y,z)
    end
end




游客,如果您要查看本帖隐藏内容请回复








回复

使用道具 举报

5熟悉之中
674/1000
排名
3998
昨日变化

3

主题

66

帖子

674

积分

Rank: 5Rank: 5

UID
183706
好友
0
蛮牛币
914
威望
0
注册时间
2016-11-18
在线时间
229 小时
最后登录
2019-5-14
2018-7-20 11:35:57 显示全部楼层
回复

使用道具 举报

7日久生情
1710/5000
排名
1771
昨日变化

2

主题

225

帖子

1710

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
237394
好友
0
蛮牛币
164
威望
0
注册时间
2017-8-13
在线时间
733 小时
最后登录
2019-5-22
2018-7-20 11:52:25 显示全部楼层
厉害了我的哥
回复

使用道具 举报

3偶尔光临
260/300
排名
8329
昨日变化

0

主题

42

帖子

260

积分

Rank: 3Rank: 3Rank: 3

UID
281485
好友
0
蛮牛币
597
威望
0
注册时间
2018-5-16
在线时间
72 小时
最后登录
2019-5-20
2018-7-20 12:11:43 显示全部楼层
感谢楼主分享
回复

使用道具 举报

7日久生情
3247/5000
排名
321
昨日变化

1

主题

405

帖子

3247

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2219
好友
1
蛮牛币
9119
威望
0
注册时间
2013-8-19
在线时间
1003 小时
最后登录
2019-5-22
2018-7-20 13:15:39 显示全部楼层
seeeseee看看
回复

使用道具 举报

排名
39857
昨日变化

0

主题

1

帖子

10

积分

Rank: 1

UID
282382
好友
0
蛮牛币
31
威望
0
注册时间
2018-5-23
在线时间
3 小时
最后登录
2018-9-18
2018-7-20 14:06:45 显示全部楼层
找了  好久的  虚拟摇杆 终于找到了  太好了  感谢楼主分享
回复 支持 反对

使用道具 举报

7日久生情
2540/5000
排名
848
昨日变化

14

主题

178

帖子

2540

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
157377
好友
4
蛮牛币
5676
威望
0
注册时间
2016-7-19
在线时间
1170 小时
最后登录
2019-5-22
2018-7-20 14:25:47 显示全部楼层
6666666666666666666666666666666
回复 支持 反对

使用道具 举报

5熟悉之中
761/1000
排名
4414
昨日变化

2

主题

122

帖子

761

积分

Rank: 5Rank: 5

UID
252095
好友
1
蛮牛币
592
威望
0
注册时间
2017-11-2
在线时间
305 小时
最后登录
2019-4-11
2018-7-20 14:31:12 显示全部楼层
不过的学习资料
回复

使用道具 举报

5熟悉之中
711/1000
排名
4267
昨日变化

3

主题

157

帖子

711

积分

Rank: 5Rank: 5

UID
243239
好友
0
蛮牛币
1772
威望
0
注册时间
2017-9-13
在线时间
207 小时
最后登录
2019-4-28
2018-7-20 14:40:30 显示全部楼层
回复

使用道具 举报

7日久生情
3946/5000
排名
226
昨日变化

0

主题

853

帖子

3946

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
15165
好友
2
蛮牛币
293
威望
0
注册时间
2014-2-21
在线时间
1024 小时
最后登录
2019-5-22
QQ
2018-7-20 15:10:35 显示全部楼层
谢谢分享谢谢分享谢谢分享谢谢分享
回复 支持 反对

使用道具 举报

3偶尔光临
289/300
排名
6887
昨日变化

2

主题

13

帖子

289

积分

Rank: 3Rank: 3Rank: 3

UID
213857
好友
0
蛮牛币
266
威望
0
注册时间
2017-3-23
在线时间
84 小时
最后登录
2018-9-4
2018-7-20 15:44:25 显示全部楼层
6666666666666
回复

使用道具 举报

4四处流浪
438/500
排名
8243
昨日变化

0

主题

225

帖子

438

积分

Rank: 4

UID
281167
好友
1
蛮牛币
883
威望
0
注册时间
2018-5-14
在线时间
65 小时
最后登录
2018-12-10
2018-7-20 19:20:48 显示全部楼层
感谢分享
回复

使用道具 举报

6蛮牛粉丝
1445/1500
排名
1569
昨日变化

0

主题

46

帖子

1445

积分

Rank: 6Rank: 6Rank: 6

UID
175786
好友
0
蛮牛币
2091
威望
0
注册时间
2016-10-15
在线时间
577 小时
最后登录
2019-4-25
2018-7-20 21:52:19 显示全部楼层
不错不错!!!!!
回复

使用道具 举报

5熟悉之中
876/1000
排名
2502
昨日变化

0

主题

66

帖子

876

积分

Rank: 5Rank: 5

UID
231194
好友
0
蛮牛币
2843
威望
0
注册时间
2017-7-10
在线时间
226 小时
最后登录
2019-3-12
2018-7-21 08:28:38 显示全部楼层
谢谢分享
回复

使用道具 举报

7日久生情
1857/5000
排名
1192
昨日变化

0

主题

543

帖子

1857

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
87577
好友
0
蛮牛币
6808
威望
0
注册时间
2015-3-31
在线时间
336 小时
最后登录
2019-5-22
2018-7-21 08:47:20 显示全部楼层
too good too strong!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则