游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2337

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2373|回复: 119

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

  [复制链接]  [移动端链接]
排名
573
昨日变化

18

主题

331

帖子

2307

积分

Rank: 9Rank: 9Rank: 9

UID
13110
好友
12
蛮牛币
4894
威望
0
注册时间
2014-1-21
在线时间
595 小时
最后登录
2018-8-24

专栏作家认证开发者

发表于 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熟悉之中
540/1000
排名
4814
昨日变化

3

主题

65

帖子

540

积分

Rank: 5Rank: 5

UID
183706
好友
0
蛮牛币
680
威望
0
注册时间
2016-11-18
在线时间
184 小时
最后登录
2018-10-23
发表于 2018-7-20 11:35:57 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1170/1500
排名
2719
昨日变化

2

主题

182

帖子

1170

积分

Rank: 6Rank: 6Rank: 6

UID
237394
好友
0
蛮牛币
42
威望
0
注册时间
2017-8-13
在线时间
480 小时
最后登录
2018-10-23
发表于 2018-7-20 11:52:25 | 显示全部楼层
厉害了我的哥

回复

使用道具 举报

3偶尔光临
179/300
排名
10346
昨日变化

0

主题

37

帖子

179

积分

Rank: 3Rank: 3Rank: 3

UID
281485
好友
0
蛮牛币
422
威望
0
注册时间
2018-5-16
在线时间
44 小时
最后登录
2018-10-23
发表于 2018-7-20 12:11:43 | 显示全部楼层
感谢楼主分享

回复

使用道具 举报

7日久生情
2943/5000
排名
360
昨日变化

1

主题

374

帖子

2943

积分

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

UID
2219
好友
1
蛮牛币
7886
威望
0
注册时间
2013-8-19
在线时间
900 小时
最后登录
2018-10-19
发表于 2018-7-20 13:15:39 | 显示全部楼层
seeeseee看看

回复

使用道具 举报

排名
38234
昨日变化

0

主题

1

帖子

10

积分

Rank: 1

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

回复 支持 反对

使用道具 举报

7日久生情
2048/5000
排名
1087
昨日变化

14

主题

157

帖子

2048

积分

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

UID
157377
好友
4
蛮牛币
5185
威望
0
注册时间
2016-7-19
在线时间
883 小时
最后登录
2018-10-23
发表于 2018-7-20 14:25:47 | 显示全部楼层
6666666666666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
680/1000
排名
4526
昨日变化

2

主题

114

帖子

680

积分

Rank: 5Rank: 5

UID
252095
好友
1
蛮牛币
569
威望
0
注册时间
2017-11-2
在线时间
258 小时
最后登录
2018-10-23
发表于 2018-7-20 14:31:12 | 显示全部楼层
不过的学习资料

回复

使用道具 举报

5熟悉之中
669/1000
排名
4208
昨日变化

3

主题

151

帖子

669

积分

Rank: 5Rank: 5

UID
243239
好友
0
蛮牛币
1603
威望
0
注册时间
2017-9-13
在线时间
187 小时
最后登录
2018-9-16
发表于 2018-7-20 14:40:30 | 显示全部楼层

回复

使用道具 举报

7日久生情
3613/5000
排名
263
昨日变化

0

主题

828

帖子

3613

积分

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

UID
15165
好友
2
蛮牛币
169
威望
0
注册时间
2014-2-21
在线时间
887 小时
最后登录
2018-10-23
QQ
发表于 2018-7-20 15:10:35 | 显示全部楼层
谢谢分享谢谢分享谢谢分享谢谢分享
[发帖际遇]: okok211 在网吧通宵,花了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

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

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四处流浪
429/500
排名
8044
昨日变化

0

主题

223

帖子

429

积分

Rank: 4

UID
281167
好友
1
蛮牛币
858
威望
0
注册时间
2018-5-14
在线时间
64 小时
最后登录
2018-9-27
发表于 2018-7-20 19:20:48 | 显示全部楼层
感谢分享

回复

使用道具 举报

6蛮牛粉丝
1404/1500
排名
1522
昨日变化

0

主题

45

帖子

1404

积分

Rank: 6Rank: 6Rank: 6

UID
175786
好友
0
蛮牛币
2086
威望
0
注册时间
2016-10-15
在线时间
563 小时
最后登录
2018-10-23
发表于 2018-7-20 21:52:19 | 显示全部楼层
不错不错!!!!!

回复

使用道具 举报

5熟悉之中
775/1000
排名
2701
昨日变化

0

主题

60

帖子

775

积分

Rank: 5Rank: 5

UID
231194
好友
0
蛮牛币
2593
威望
0
注册时间
2017-7-10
在线时间
199 小时
最后登录
2018-10-22
发表于 2018-7-21 08:28:38 | 显示全部楼层
谢谢分享
[发帖际遇]: 一个袋子砸在了 简简单单happy 头上,简简单单happy 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1401/1500
排名
1622
昨日变化

0

主题

404

帖子

1401

积分

Rank: 6Rank: 6Rank: 6

UID
87577
好友
0
蛮牛币
4665
威望
0
注册时间
2015-3-31
在线时间
241 小时
最后登录
2018-10-23
发表于 2018-7-21 08:47:20 | 显示全部楼层
too good too strong!

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表