找回密码
 注册帐号

扫一扫,访问微社区

抢楼 抢楼 本帖为抢楼帖,欢迎抢楼! 

半闲之人 使用UGUI实现虚拟摇杆【项目示例】

27
回复
6539
查看
[ 复制链接 ]
5熟悉之中
598/1000
排名
5761
昨日变化

3

主题

44

帖子

598

积分

Rank: 5Rank: 5

UID
43978
好友
2
蛮牛币
1966
威望
0
注册时间
2014-9-7
在线时间
177 小时
最后登录
2018-9-10
2015-9-3 00:41:06 显示全部楼层 阅读模式

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

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

x



视频是我们正在制作的游戏,讲解下里面实现虚拟摇杆的过程。

主要有4个脚本: 1.png

CameraFollow 摄像机跟随人物的脚本。
GUI_EventTriggrListener 重写UGUI的事件,不多讲。
GUI_JoytackController 虚拟摇杆实现的核心。
GUI_PlayMoveController 控制人物移动。

GUI_JoytackController
[C#] 纯文本查看 复制代码
  private Vector3 origin;
    private Transform selfTransform;
    
    private float distance, moveMaxDistance = 80, activationDistance = 1;
    //偏移矢量
    private Vector2 deltaPos;
    //移动方向
    public Vector3 movePosNorm { get; private set; }
    void Awake()
    {
        #region 添加操作响应函数
        //1.拖拽开始响应函数
        GUI_EventTriggrListener.GetEventTriggerListener(gameObject).OnDragDelegate = OnDragDelegate;

        //2.拖拽结束响应函数
        GUI_EventTriggrListener.GetEventTriggerListener(gameObject).OnDragEndDelegate = OnDragEndDelegate;

        //3.触摸按钮响应函数
        GUI_EventTriggrListener.GetEventTriggerListener(gameObject).OnPointDownDelegate = OnPointerDownDelegate;
        #endregion

    }

    /// <summary>
    /// 点击响应函数
    /// </summary>
    /// <param name="go">点击的对象</param>
    private void OnPointerDownDelegate(GameObject go)
    {
        //响应玩家控制类的对应函数
        if (GUI_PlayerMoveController.moveStart != null)
            GUI_PlayerMoveController.moveStart();
    }

    /// <summary>
    /// 拖拽结束响应函数
    /// </summary>
    /// <param name="go">点击对象</param>
    private void OnDragEndDelegate(GameObject go)
    {
        //回归原点
        selfTransform.localPosition = origin;

        //响应玩家控制类的对应函数
        if (GUI_PlayerMoveController.moveEnd != null)
            GUI_PlayerMoveController.moveEnd();
    }

    /// <summary>
    /// 拖拽响应函数 
    /// </summary>
    /// <param name="go">点击对象</param>
    /// <param name="delta">拖拽距离</param>
    private void OnDragDelegate(GameObject go, Vector2 delta)
    {
        //设置偏移矢量
        deltaPos = delta;

        //设置移动位置
        selfTransform.localPosition += new Vector3(deltaPos.x, deltaPos.y, 0);
    }



    #region Unity Method

    void Start()
    {
        //初始化
        origin = transform.localPosition;
        selfTransform = this.transform;
    }

    void Update()
    {
        //计算距离,用来判定当前位置和原点的距离,用来做最大距离的限制判断值
        distance = Vector3.Distance(selfTransform.localPosition, origin);

        //限制拖拽的最大移动距离
        if (distance >= moveMaxDistance)
        {
            //计算在圆上的一个点<公式:(目标点-原点)*半径/原点到目标点的距离了>
            Vector3 point = origin + (selfTransform.localPosition - origin) * moveMaxDistance / distance;

            //设置当前位置为圆上一点
            selfTransform.localPosition = point;
        }

        //判定玩家是否激活摇杆,即滑动距离超过预设值就代表移动
        if (Vector3.Distance(selfTransform.localPosition, origin) > activationDistance)
        {
            //获取移动的方向<移除长度>
            movePosNorm = (selfTransform.localPosition - origin).normalized;
            //设置方向
            movePosNorm = new Vector3(movePosNorm.x, 0, movePosNorm.y);
        }
        else
        {
            //无移动,任一向
            movePosNorm = Vector3.zero;
        }
    }
    #endregion


GUI_PlayMoveController

[C#] 纯文本查看 复制代码
 public static MoveDelegate moveStart;
    public static MoveDelegate moveEnd;
    public static GUI_PlayerMoveController instance;

    [SerializeField]
    private GUI_JoytackController guiJoystackController;
    private Transform selfTransform;
    [SerializeField]
    private bool turnBase = false;
    private float angle;
    [SerializeField]
    private float moveSpeed;

    private Animation playerAnimation;
    void Awake()
    {
        playerAnimation = GetComponent<Animation>();
        playerAnimation["wait"].blendMode = AnimationBlendMode.Blend;
        instance = this;
        selfTransform = this.transform;

        moveStart = OnMoveStart;
        moveEnd = OnMoveEnd;
    }

    void Update()
    {
        if (turnBase)
        {
            //位置的移动
            Vector3 move = guiJoystackController.movePosNorm * Time.deltaTime * moveSpeed;
            selfTransform.localPosition += move;
            //从JoytackController移动方向 算出自身的角度
            angle = Mathf.Atan2(guiJoystackController.movePosNorm.x,
                guiJoystackController.movePosNorm.z) * Mathf.Rad2Deg;
            selfTransform.localRotation = Quaternion.Euler(Vector3.up * angle);

        }
    }


    private void OnMoveEnd()
    {
        turnBase = false;
        playerAnimation.Play("wait");

    }

    private void OnMoveStart()
    {
        turnBase = true;
        playerAnimation.Play("run");
     
    }



CameraFollow

[C#] 纯文本查看 复制代码
 public Transform targeTransform;
    private Transform selfTransform;
    public float z,y;
	// Use this for initialization
	void Start ()
	{
	    selfTransform = this.transform;
        selfTransform.LookAt(targeTransform);
    }
	
	// Update is called once per frame
	void LateUpdate () {
	    GetCameraPos();
	}

    private void GetCameraPos()
    {
        Vector3 newTagetVector3 = new Vector3(targeTransform.position.x, targeTransform.position.y+y,
            targeTransform.position.z + z);
        selfTransform.position = Vector3.Lerp(selfTransform.position, newTagetVector3, Time.deltaTime*5);
    }


demo场景的效果
QQ图片20150903003018.png

地址.txt (48 Bytes, 下载次数: 1071)
参与人数 1鲜花 +50 收起 理由
朱迪 + 50 赞一个!

查看全部评分总评分 : 鲜花 +50

回复

使用道具 举报

排名
2736
昨日变化

47

主题

356

帖子

2915

积分

Rank: 9Rank: 9Rank: 9

UID
12507
好友
19
蛮牛币
6679
威望
0
注册时间
2014-1-14
在线时间
717 小时
最后登录
2019-8-16

专栏作家

2015-9-3 07:36:27 显示全部楼层
顶顶, Easy Touch 遥感 总是在最前面,ugui无法对他做 遮挡。
回复

使用道具 举报

6蛮牛粉丝
1429/1500
排名
2036
昨日变化

5

主题

218

帖子

1429

积分

Rank: 6Rank: 6Rank: 6

UID
22111
好友
0
蛮牛币
4859
威望
0
注册时间
2014-4-19
在线时间
564 小时
最后登录
2019-1-22
2015-9-4 14:50:03 显示全部楼层
我们地图一样哎~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

4四处流浪
459/500
排名
14744
昨日变化

0

主题

60

帖子

459

积分

Rank: 4

UID
63994
好友
1
蛮牛币
26
威望
0
注册时间
2014-12-27
在线时间
345 小时
最后登录
2019-9-10
QQ
2015-9-5 09:53:05 显示全部楼层
目测有两个bug。
1,你导出移动设备,摇杆应该不能识别多点触控。
2,OnMouse在IOS设备上不被支持。
回复

使用道具 举报

3偶尔光临
197/300
排名
64937
昨日变化

9

主题

116

帖子

197

积分

Rank: 3Rank: 3Rank: 3

UID
121094
好友
0
蛮牛币
86
威望
0
注册时间
2015-9-5
在线时间
96 小时
最后登录
2019-8-27
2015-9-5 10:13:40 显示全部楼层
thank you so much for sharrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
回复

使用道具 举报

7日久生情
3186/5000
排名
351
昨日变化

2

主题

325

帖子

3186

积分

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

UID
33368
好友
2
蛮牛币
5111
威望
0
注册时间
2014-7-9
在线时间
1087 小时
最后登录
2019-6-3
2015-9-6 09:01:20 显示全部楼层
{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}、、、、、、、、
回复

使用道具 举报

5熟悉之中
869/1000
排名
3655
昨日变化

1

主题

124

帖子

869

积分

Rank: 5Rank: 5

UID
36319
好友
2
蛮牛币
977
威望
0
注册时间
2014-7-25
在线时间
326 小时
最后登录
2019-8-3
2015-9-6 10:19:22 显示全部楼层
q7377327 发表于 2015-9-5 09:53
目测有两个bug。
1,你导出移动设备,摇杆应该不能识别多点触控。
2,OnMouse在IOS设备上不被支持。 ...

onMouse在IOS上面不被支持?那是不是代表我用onMouseDown写的长按也不被支持啊?
回复

使用道具 举报

4四处流浪
459/500
排名
14744
昨日变化

0

主题

60

帖子

459

积分

Rank: 4

UID
63994
好友
1
蛮牛币
26
威望
0
注册时间
2014-12-27
在线时间
345 小时
最后登录
2019-9-10
QQ
2015-9-6 10:45:38 显示全部楼层
gdzzzyyy 发表于 2015-9-6 10:19
onMouse在IOS上面不被支持?那是不是代表我用onMouseDown写的长按也不被支持啊? ...

是的IOS不支持OnMouse所有事件
回复

使用道具 举报

6蛮牛粉丝
1130/1500
排名
64937
昨日变化

2

主题

152

帖子

1130

积分

Rank: 6Rank: 6Rank: 6

UID
8426
好友
1
蛮牛币
847
威望
0
注册时间
2013-11-19
在线时间
976 小时
最后登录
2019-9-6
QQ
2015-9-6 11:11:17 显示全部楼层
q7377327 发表于 2015-9-6 10:45
是的IOS不支持OnMouse所有事件

OnMouseDown,OnMouseMove这些在移动平台都支持,只是如果要用多点触摸,就得用Touch。
回复

使用道具 举报

6蛮牛粉丝
1213/1500
排名
1669
昨日变化

3

主题

104

帖子

1213

积分

Rank: 6Rank: 6Rank: 6

UID
43676
好友
0
蛮牛币
1985
威望
0
注册时间
2014-9-4
在线时间
329 小时
最后登录
2019-9-16
2015-9-6 11:53:17 显示全部楼层
不错参考一下谢谢楼主
回复

使用道具 举报

4四处流浪
459/500
排名
14744
昨日变化

0

主题

60

帖子

459

积分

Rank: 4

UID
63994
好友
1
蛮牛币
26
威望
0
注册时间
2014-12-27
在线时间
345 小时
最后登录
2019-9-10
QQ
2015-9-6 11:57:46 显示全部楼层
bingheliefeng 发表于 2015-9-6 11:11
OnMouseDown,OnMouseMove这些在移动平台都支持,只是如果要用多点触摸,就得用Touch。 ...

http://game.ceeger.com/Manual/iphone-unsupported.html
这圣典里面记录了IOS不支持的功能,12年的,你参考一下
回复

使用道具 举报

7日久生情
1661/5000
排名
1483
昨日变化

0

主题

145

帖子

1661

积分

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

UID
44204
好友
1
蛮牛币
1580
威望
0
注册时间
2014-9-9
在线时间
662 小时
最后登录
2019-9-10
QQ
2015-9-6 13:53:18 显示全部楼层
q7377327 发表于 2015-9-6 11:57
http://game.ceeger.com/Manual/iphone-unsupported.html
这圣典里面记录了IOS不支持的功能,12年的,你 ...

现在可以用的。。你可以试试。。我用过。在ipad上。
回复

使用道具 举报

6蛮牛粉丝
1130/1500
排名
64937
昨日变化

2

主题

152

帖子

1130

积分

Rank: 6Rank: 6Rank: 6

UID
8426
好友
1
蛮牛币
847
威望
0
注册时间
2013-11-19
在线时间
976 小时
最后登录
2019-9-6
QQ
2015-9-6 14:26:37 显示全部楼层
q7377327 发表于 2015-9-6 11:57
http://game.ceeger.com/Manual/iphone-unsupported.html
这圣典里面记录了IOS不支持的功能,12年的,你 ...

我已经早在移动项目中用过了,现在它会把第一个触摸转化成Mouse事件
回复

使用道具 举报

排名
576
昨日变化

12

主题

529

帖子

2926

积分

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

UID
24575
好友
7
蛮牛币
4021
威望
0
注册时间
2014-5-11
在线时间
856 小时
最后登录
2019-8-4
2015-9-6 15:15:10 显示全部楼层
移动设备是支持OnMouse事件的,问题是单点触控支持而已。所以请有需要的同学用Input.touches去做多点。
回复

使用道具 举报

5熟悉之中
534/1000
排名
5823
昨日变化

5

主题

92

帖子

534

积分

Rank: 5Rank: 5

UID
117625
好友
3
蛮牛币
928
威望
0
注册时间
2015-8-11
在线时间
179 小时
最后登录
2019-7-1
2015-9-6 21:14:31 显示全部楼层
下载下来学习一下
回复

使用道具 举报

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

本版积分规则