今天终于步入正轨了,写了一天的代码,虽然不多,但是是个好的开始。

下面是游戏左侧的摇杆,用来前后左右移动的。注释很详细了。
游戏摇杆,就是平面上放两张图片(一张也行),其中一张作为参考点,手指按到的另一张片与它参考的图片形成一个向量,然后传递给3D人物。

using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine;
using UnityEngine.UI;
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public GameObject Joystick;
    public static float h;//h和v的值传回给移动脚本,使得物体移动
    public static float v;
    private bool isPress = false;//Button按钮按下初始设为假
    private Vector2 touchPos = Vector2.zero;//按下的位置设为零

    void Update()
    {
        if (isPress)
        {
            RectTransformUtility.ScreenPointToLocalPointInRectangle(Joystick.transform as RectTransform, AnyTouch(), null, out touchPos);
            float distance = Vector2.Distance(Vector2.zero, touchPos);
            if (distance > 150)//限制Button的范围
            {
                if (distance > 800)
                {
                    isPress = false;
                    transform.localPosition = Vector2.zero;
                }
                else
                {
                    touchPos = touchPos.normalized * 150;
                    transform.localPosition = touchPos;
                }
            }
            else
            {
                transform.localPosition = touchPos;
            }
        }
        h = touchPos.x / 150;
        v = touchPos.y / 150;
        touchPos = Vector2.zero;//复位,不然会一直走
    }
    public void OnPointerDown(PointerEventData pointerEventData)
    {//按钮按下时触发
        isPress = true;
    }
    public void OnPointerUp(PointerEventData pointerEventData)
    {//按键弹起时触发
        isPress = false;
        transform.localPosition = Vector2.zero;
    }
    private Vector2 AnyTouch()
    {
        switch (Input.touchCount)
        {
            case 0:return Input.mousePosition;
            default:return Input.GetTouch(0).position;
        }
    }
}

放上我借鉴的链接

不得不说,第一个链接,我感觉他写的时候都没测试。三个bug:1.位置是根据屏幕大小会动的。2.是不能多指触屏。3.是移动摇杆后会一直向那个方向移动。

Unity3D实现虚拟按钮控制人物移动效果_C#教程_脚本之家

另一个链接,里面很详细,用IDragHandler接口实现。这个大佬的代码里没用上update,应该会更好。

轮子篇(1):新事件系统,48行代码撸JoyStick – Unity Connect

2 个评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注