
一般游戏用的EasyTouch插件的功能 就两三种比较少,把插件全导入占用内存太大,所以本文对摇杆部分进行了提验 其他部分都可以照样提出来用。
1.主相机设置 屏幕分辩 16:9
2 创建一块Plane 和控制的移动对象 Cube;
3 创建ui摇杆 joyTick.
创建好后运行 如图:

5 摇杆控制代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
using System.Collections.Generic;
/// <summary>
/// 虚拟摇杆(暂作用于控制层)
/// </summary>
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
public List<Vector2> caluatePostionQueue;
/// <summary>
/// 摇杆最大半径
/// 以像素为单位
/// </summary>
public float JoyStickRadius = 50;
/// <summary>
/// 摇杆重置所诉
/// </summary>
public float JoyStickResetSpeed = 5.0f;
/// <summary>
/// 当前物体的Transform组件
/// </summary>
private RectTransform selfTransform;
/// <summary>
/// 是否触摸了虚拟摇杆
/// </summary>
private bool isTouched = false;
/// <summary>
/// 虚拟摇杆的默认位置
/// </summary>
private Vector2 originPosition;
/// <summary>
/// 虚拟摇杆的移动方向
/// </summary>
private Vector2 touchedAxis;
public Vector2 TouchedAxis
{
get
{
return touchedAxis.normalized;
}
}
/// <summary>
/// 定义触摸开始事件委托
/// </summary>
public delegate void JoyStickTouchBegin(Vector2 vec);
/// <summary>
/// 定义触摸过程事件委托
/// </summary>
/// <param name="vec">虚拟摇杆的移动方向</param>
public delegate void JoyStickTouchMove(Vector2 vec);
/// <summary>
/// 定义触摸结束事件委托
/// </summary>
public delegate void JoyStickTouchEnd();
/// <summary>
/// 注册触摸开始事件
/// </summary>
public event JoyStickTouchBegin OnJoyStickTouchBegin;
/// <summary>
/// 注册触摸过程事件
/// </summary>
public event JoyStickTouchMove OnJoyStickTouchMove;
/// <summary>
/// 注册触摸结束事件
/// </summary>
public event JoyStickTouchEnd OnJoyStickTouchEnd;
private Image selfImg;
[SerializeField]
private Image backImg;
void Start()
{
//初始化虚拟摇杆的默认方向
selfTransform = this.GetComponent<RectTransform>();
originPosition = selfTransform.anchoredPosition;
selfImg = GetComponent<Image>();
//caluatePostionQueue = new List<Vector2>();
//backImg = transform.parent.GetComponent<Image> ();
}
public bool IsTouched()
{
return isTouched;
}
//开始控制摇杆
public void OnPointerDown(PointerEventData eventData)
{
//MainPanelContrller.Instance.SetAutoMove(false);
isTouched = true;
touchedAxis = GetJoyStickAxis(eventData);
if (this.OnJoyStickTouchBegin != null)
this.OnJoyStickTouchBegin(TouchedAxis);
SetImageAlpha(selfImg, 1f);
SetImageAlpha(backImg, 1f);
}
//控制摇杆UI显示
private void SetImageAlpha(Image img, float v)
{
Color current = img.color;
current.a = v;
img.color = current;
}
//松开摇杆
public void OnPointerUp(PointerEventData eventData)
{
isTouched = false;
selfTransform.anchoredPosition = originPosition;
touchedAxis = Vector2.zero;
if (this.OnJoyStickTouchEnd != null)
this.OnJoyStickTouchEnd();
SetImageAlpha(selfImg, 0.3f);
SetImageAlpha(backImg, 0.3f);
}
//拖动摇杆
public void OnDrag(PointerEventData eventData)
{
touchedAxis = GetJoyStickAxis(eventData);
if (this.OnJoyStickTouchMove != null)
this.OnJoyStickTouchMove(TouchedAxis);
}
void Update()
{
松开虚拟摇杆后让虚拟摇杆回到默认位置
//if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude)
// selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * JoyStickResetSpeed;
}
/// <summary>
/// 返回虚拟摇杆的偏移量
/// </summary>
/// <returns>The joy stick axis.</returns>
/// <param name="eventData">Event data.</param>
private Vector2 GetJoyStickAxis(PointerEventData eventData)
{
//获取手指位置的世界坐标
Vector3 worldPosition;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform,
eventData.position, eventData.pressEventCamera, out worldPosition))
selfTransform.position = worldPosition;
//获取摇杆的偏移量
Vector2 touchAxis = selfTransform.anchoredPosition - originPosition;
//摇杆偏移量限制
if (touchAxis.magnitude >= JoyStickRadius)
{
touchAxis = touchAxis.normalized * JoyStickRadius;
selfTransform.anchoredPosition = touchAxis;
}
return touchAxis;
}
}
6.控制移动的物体脚本代码:
sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCtrl : MonoBehaviour {
private float time;
public JoyStick stick;
public float speed = 5f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
Vector2 stickValue;
//if (autoMove)
// stickValue = autoMoveDir;
//else
stickValue = stick.TouchedAxis;
if (stickValue.x == 0 && stickValue.y == 0)
{
time = 0;
// anim.SetBool("run", false);
return;
}
Vector3 cameraForward = Camera.main.transform.forward;
cameraForward.y = 0;
cameraForward = cameraForward.normalized;
Vector3 cameraRight = Camera.main.transform.right;
cameraRight.y = 0;
cameraRight = cameraRight.normalized;
Vector3 off = cameraForward * stickValue.y * speed * Time.deltaTime;
Vector3 nextPos = transform.position + off;
nextPos = nextPos + cameraRight * stickValue.x * speed * Time.deltaTime;
Quaternion targetRot = Quaternion.LookRotation(nextPos - transform.position);
Quaternion curr = Quaternion.RotateTowards(transform.rotation, targetRot, 180);//180 * Time.deltaTime
transform.rotation = curr;
time += Time.deltaTime;
transform.position = Vector3.Lerp(transform.position, nextPos, time * 0.5f);
}
}
7.场景对象挂载:
(1):

(2):

8 运行结果展示:

9 .备注:移动控制也可通过摇杆中的事件进行控制,这样就解耦摇杆和控制对象,摇杆对象在全局控制器中生成并且注册相关事件,谁注册摇杆中的事件 就可以控制谁。