简单的unity3D创建虚拟摇杆和控制角色移动
- 利用ScrollRect创建虚拟摇杆
-
- 效果图
- 为虚拟摇杆写脚本
- 创建虚拟摇杆
- 虚拟摇杆控制角色转弯以及移动
利用ScrollRect创建虚拟摇杆
效果图
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn10MJpXT4tmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLzgjMxMzMxYTMxIDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
为虚拟摇杆写脚本
首先我们要继承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得了
将之前写好的脚本ScrollCircle拉到BackGround上面,再将Image拉到content里面。
这时运行一下游戏,你会发现你已经拥有了一个可以随意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脚本拖动到角色上面,运行游戏,会发现角色可以跟随摇杆移动了。`