天天看点

简单的unity3D创建虚拟摇杆和控制角色移动利用ScrollRect创建虚拟摇杆

简单的unity3D创建虚拟摇杆和控制角色移动

  • 利用ScrollRect创建虚拟摇杆
    • 效果图
    • 为虚拟摇杆写脚本
    • 创建虚拟摇杆
    • 虚拟摇杆控制角色转弯以及移动

利用ScrollRect创建虚拟摇杆

效果图

简单的unity3D创建虚拟摇杆和控制角色移动利用ScrollRect创建虚拟摇杆

为虚拟摇杆写脚本

首先我们要继承ScrollRect类,并利用该类的OnDrag和OnEndDrag实现对摇杆的控制,

//创建虚拟摇杆
public class ScrollCircle : ScrollRect
{
    #region 参数设置
    private float mradius = 0f;//半径
    private const float dis = 0.5f;//距离
    private GameObject hero;
    public float x=0;
    public float y=0;
    private Vector3 v2;
    #endregion 
    // Use this for initialization
    protected override void Start()
    {
        base.Start();
        // 能移动的半径 = 摇杆的宽 * Dis
        mradius = content.sizeDelta.x * dis;
        hero = GameObject.FindGameObjectWithTag("Player");//获取角色
        Vector3 posi = Camera.main.WorldToScreenPoint(hero.transform.position);//将角色的世界坐标转化为屏幕上的坐标
        posi -= new Vector3(Screen.width / 3, Screen.height /7, 0);//Screen.width和Screen.height分别代表屏幕的宽和高
        this.transform.position = posi;//设置虚拟摇杆的位置
	}
	
	// Update is called once per frame
	void Update (){
    }

     void FixedUpdate()
    {
      
    }

    //当拖动摇杆时触发
    public override void OnDrag(PointerEventData eventData)
    {
        base.OnDrag(eventData);
        //获取摇杆和锚点之间的相对位置
        Vector2 contentPosition = content.anchoredPosition;
        //判断摇杆和锚点之间的相对位置的长度是否大于半径
        if (contentPosition.magnitude > mradius)
        {
            //设置摇杆可移动的最远距离
            contentPosition = contentPosition.normalized * mradius;//normalized是把当前向量的模长变为1,就是把向量变为单位向量
            SetContentAnchoredPosition(contentPosition);//设置内容的锚点位置
        }
        v2 = content.anchoredPosition; //获取摇杆和锚点之间的相对位置
        //x,和y的作用是让角色跟随摇杆转动,在后面的角色控制脚本中会用到
        x = v2.x;
        y = v2.y;
        
    }

    //当结束拖动摇杆时触发
    public override void OnEndDrag(PointerEventData eventData)
    {
        base.OnEndDrag(eventData);
        //当摇杆不被使用时,x,y置0,这样做是让角色停止移动
        x = 0;
        y = 0;
    }
}
写好的脚本我们命名为:ScrollCircle
           

创建虚拟摇杆

首先创建一个画布Canvas,在画布上创建一个image,命名为BackGround,再为BackGround创建一个子image,最后给画布Canvas一个tag,名字就叫Canvas得了

简单的unity3D创建虚拟摇杆和控制角色移动利用ScrollRect创建虚拟摇杆

将之前写好的脚本ScrollCircle拉到BackGround上面,再将Image拉到content里面。

简单的unity3D创建虚拟摇杆和控制角色移动利用ScrollRect创建虚拟摇杆

这时运行一下游戏,你会发现你已经拥有了一个可以随意360度拖动的虚拟摇杆了

虚拟摇杆控制角色转弯以及移动

首先我们要为角色编写脚本,脚本名字就叫Hero吧。

这时我们就要用到之前在ScrollCircle脚本里面定义的x,y了。那么我们先利用 GameObject.FindGameObjectWithTag(“Canvas”).GetComponentInChildren();得到ScrollCircle脚本。

获取他的x,y的值。

下面贴上代码

public class Hero : MonoBehaviour {

    public Animator anim;
    private ScrollCircle sc;
    private Vector3 v;
    private Rigidbody rb;
	// Use this for initialization
	void Start () {
        sc = GameObject.FindGameObjectWithTag("Canvas").GetComponentInChildren<ScrollCircle>();//获取ScrollCircle
        rb = this.GetComponent<Rigidbody>();//获取缸体
	}
	
	// Update is called once per frame
	void Update () {

	}

    void FixedUpdate()
    {
        if (sc.x != 0 || sc.y != 0)//等于0说明摇杆没有被拉动,所以不要移动和转弯
        {
            v = new Vector3(sc.x, this.transform.position.y, sc.y);//因为世界坐标中,物体前方的是Z轴,所以我们把ScrollCircle脚本里面的 y 作为角色的Z坐标。
            rb.velocity =1f * transform.forward;//让角色往前移动
            this.transform.LookAt(v);//利用LookAt函数让角色转弯
        }
    }
     

}
``
最后将hero脚本拖动到角色上面,运行游戏,会发现角色可以跟随摇杆移动了。`


           

继续阅读