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

扫一扫,访问微社区

开发者专栏

关注:2286

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

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

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

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

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

18

主题

331

帖子

2305

积分

Rank: 9Rank: 9Rank: 9

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

专栏作家认证开发者

发表于 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




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









回复

使用道具 举报

4四处流浪
413/500
排名
5834
昨日变化
39

3

主题

55

帖子

413

积分

Rank: 4

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

回复

使用道具 举报

5熟悉之中
973/1000
排名
3287
昨日变化
13

2

主题

157

帖子

973

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

排名
17121
昨日变化
6

0

主题

31

帖子

89

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

7日久生情
2836/5000
排名
374
昨日变化

1

主题

367

帖子

2836

积分

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

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

回复

使用道具 举报

排名
37342
昨日变化
10

0

主题

1

帖子

9

积分

Rank: 1

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

回复 支持 反对

使用道具 举报

7日久生情
1833/5000
排名
1238
昨日变化
4

14

主题

144

帖子

1833

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
628/1000
排名
4689
昨日变化
17

2

主题

110

帖子

628

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
645/1000
排名
4305
昨日变化
5

3

主题

150

帖子

645

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
3482/5000
排名
272
昨日变化
1

0

主题

818

帖子

3482

积分

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

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

回复 支持 反对

使用道具 举报

3偶尔光临
268/300
排名
6804
昨日变化
4

2

主题

13

帖子

268

积分

Rank: 3Rank: 3Rank: 3

UID
213857
好友
0
蛮牛币
222
威望
0
注册时间
2017-3-23
在线时间
79 小时
最后登录
2018-8-3
发表于 2018-7-20 15:44:25 | 显示全部楼层
6666666666666

回复

使用道具 举报

4四处流浪
416/500
排名
8272
昨日变化
3

0

主题

220

帖子

416

积分

Rank: 4

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

回复

使用道具 举报

6蛮牛粉丝
1251/1500
排名
1787
昨日变化
2

0

主题

45

帖子

1251

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

5熟悉之中
690/1000
排名
3025
昨日变化
12

0

主题

54

帖子

690

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

6蛮牛粉丝
1182/1500
排名
1933
昨日变化

0

主题

326

帖子

1182

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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