UnityStandardAssets里自带的Joystick脚本修改

最近打算做个2D坦克大战手游,然后去找实习,希望能够顺顺利利~
关于这个项目,我是想通过摇杆来控制坦克的移动,这让我想起StandardAssets里Characters.package的预设MobileSingleStickControl,配合ThirdPersonController和MultipurposeCameraRig这两个预设十分好用,先来幅效果图:
UnityStandardAssets里自带的Joystick脚本修改_第1张图片

可是问题就是出在这,他们三者特别是摇杆和人物控制这两个预设,配合实在太完美,似乎完全是为对方而存在,如果直接把摇杆应用到我这个项目会有以下问题:
1、坦克一般只能直着或者横着走,而这个预设摇杆还会让坦克斜着走;
2、坦克的移动速度会用根据拖拽摇杆的强度而改变,事实上只需要知道摇杆的方向,坦克的移动速度就应该是匀速的
为了解决我的困惑,我研究了一下MobileSingleStickControl这个预设,当然作为新手的我并不能完全理解全部的信息,但我发现只需要修改该预设的MobileJoystick子对象的Joystick脚本,大概就能解决我的问题,让它成为我心目中的摇杆!
首先为了解决第一个问题,我在OnDrag函数增加了两个方向——横向和竖向的判断条件,从而修改了方向的结果。

UnityStandardAssets里自带的Joystick脚本修改_第2张图片
(word作图,将就将就- -)

具体的做法是根据移动向量(Vector3),用其X和Y的比值去判断目前摇杆属于哪个区域:

1、当-11或X/Y<-1时,摇杆处于红色区域,则判断坦克是在x轴方向运动(横向);
3、当X/Y=1时摇杆处于两个区域的边界时,则判断坦克不运动;

值得注意的一点是区分完了x,y轴的方向,还需要区分正反方向,那就是分别判断X和Y的正负值,然后和移动的数值相乘:

然后到了第二个问题,相对比较简单。在传递移动量去作移动时,由具体的移动向量改为固定向量即可。

最后修改完的OnDrag函数是这样的:

 public void OnDrag(PointerEventData data)
        {
            Vector3 newPos = Vector3.zero;//具体的移动向量
            Vector3 moveVector = Vector3.zero;//应该传递的固定向量
            int x = 1; // x轴的正负号
            int y = 1; // y轴的正负号

            if (m_UseX)
            {
                int delta = (int)(data.position.x - m_StartPos.x);
                delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
                newPos.x = delta;
            }

            if (m_UseY)
            {
                int delta = (int)(data.position.y - m_StartPos.y);
                delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
                newPos.y = delta;
            }

            //判断x轴的正负号
            if (newPos.x >= 0)
                x = 1;
            else
                x = -1;
            //判断y轴的正负号
            if (newPos.y >= 0)
                y = 1;
            else
                y = -1;

            float rate = newPos.x / newPos.y; // 摇杆拖动的偏向方向
            if (rate > 1 || rate < -1)        // 摇杆的拖动偏向x轴
            {
                moveVector = new Vector3(m_StartPos.x + x * MovementRange, m_StartPos.y, m_StartPos.z);
                Debug.Log("Horizontal");
            }
            else if (rate < 1 && rate > -1)   // 摇杆的拖动偏向y轴
            {
                moveVector = new Vector3(m_StartPos.x, m_StartPos.y + y * MovementRange, m_StartPos.z);
                Debug.Log("Vertical");
            }
            else                             // 摇杆的拖动没有偏向
            {
                moveVector = m_StartPos;
                Debug.Log("None");
            }

            transform.position = new Vector3(m_StartPos.x + newPos.x, m_StartPos.y + newPos.y, m_StartPos.z + newPos.z);
            UpdateVirtualAxes(moveVector);
        }

UpdateVirtualAxes就是传递移动量的函数,建议对比原来脚本的OnDrag函数一起看会比较容易理解。
大胆修改官方脚本,也不知道是对是错,不过修改过后倒是完全符合我的要求,哈哈哈,这也算是自学的乐趣吧。
长路漫漫,上下求索。

你可能感兴趣的:(Unity3d)