轉(zhuǎn)自:http://blog.csdn.net/qinyuanpei/article/details/49510021
創(chuàng)建搖桿控制器
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler {
//--------------------------- property ---------------------------
public float joyStickRadius = 50; //搖桿最大半徑
public float joyStickResetSpeed = 5; //遙控重置速度
private RectTransform selfTransform; //自己的transform
private bool isTouched = false; //是否觸摸
private Vector2 originPosition; //遙桿當(dāng)前位置
private Vector2 touchedAxis; //搖桿的移動(dòng)方向
//讀取touchedAxis的值時(shí),不會(huì)大于最大半徑
public Vector2 TouchedAxis {
get {
if(touchedAxis.magnitude < joyStickRadius) {
return touchedAxis.normalized / joyStickRadius;
}
return touchedAxis.normalized;
}
}
//定義委托, 開始, 過程, 結(jié)束事件
public delegate void JoyStickTouchBegin(Vector2 vec);
public delegate void JoyStickTouchMove(Vector2 vec);
public delegate void JoyStickTouchEnd();
//注冊(cè)觸摸開始, 過程, 結(jié)束事件
public event JoyStickTouchBegin OnJoyStickTouchBegin;
public event JoyStickTouchMove OnJoyStickTouchMove;
public event JoyStickTouchEnd OnJoyStickTouchEnd;
//--------------------------- Interface ---------------------------
//UI.Button 捕獲當(dāng)點(diǎn)擊事件點(diǎn)下時(shí)
public void OnPointerDown(PointerEventData eventData) {
isTouched = true;
touchedAxis = GetJoyStickAxis (eventData);
if (this.OnJoyStickTouchBegin != null) {
this.OnJoyStickTouchBegin (touchedAxis);
}
}
//捕獲當(dāng)點(diǎn)擊事件抬起時(shí)
public void OnPointerUp(PointerEventData eventData) {
isTouched = false;
selfTransform.anchoredPosition = originPosition;
touchedAxis = Vector2.zero;
if (this.OnJoyStickTouchEnd != null) {
this.OnJoyStickTouchEnd ();
}
}
//捕獲當(dāng)點(diǎn)擊事件移動(dòng)時(shí)
public void OnDrag(PointerEventData eventData) {
touchedAxis = GetJoyStickAxis (eventData);
if(this.OnJoyStickTouchMove != null) {
this.OnJoyStickTouchMove (touchedAxis);
}
}
//--------------------------- method ---------------------------
void Start () {
//初始化搖桿的默認(rèn)方向
selfTransform = this.GetComponent<RectTransform> ();
originPosition = selfTransform.anchoredPosition;
}
void Update () {
//當(dāng)虛擬搖桿移動(dòng)到最大半徑時(shí), 搖桿無(wú)法移動(dòng)
//為了確保被控制物體可以繼續(xù)移動(dòng), 在這里手動(dòng)觸發(fā)OnJoyStickTouchMove事件
if(isTouched && touchedAxis.magnitude >= joyStickRadius) {
if (this.OnJoyStickTouchMove != null) {
this.OnJoyStickTouchMove (touchedAxis);
}
}
}
//返回?fù)u桿偏移量
private Vector2 GetJoyStickAxis(PointerEventData eventData) {
//獲取手指位置的世界坐標(biāo)
Vector3 worldPosition;
if(RectTransformUtility.ScreenPointToWorldPointInRectangle(
selfTransform, eventData.position, eventData.pressEventCamera, out worldPosition)) {
selfTransform.position = worldPosition;
}
//獲取搖桿的偏移量
Vector2 theTouchAxis = selfTransform.anchoredPosition - originPosition;
if(theTouchAxis.magnitude >= joyStickRadius) {
theTouchAxis = theTouchAxis.normalized * joyStickRadius;
selfTransform.anchoredPosition = theTouchAxis;
}
return theTouchAxis;
}
}
根據(jù)搖桿移動(dòng)角色
using UnityEngine;
using System.Collections;
public class JoyStick3D : MonoBehaviour {
//--------------------------- property ---------------------------
public float moveSpeed;
private JoyStick joyStick;
//--------------------------- method ---------------------------
void Start () {
joyStick = GameObject.FindObjectOfType<JoyStick> ();
joyStick.OnJoyStickTouchBegin += OnJoyStickBegin;
joyStick.OnJoyStickTouchMove += OnJoyStickMove;
joyStick.OnJoyStickTouchEnd += OnjoyStickEnd;
}
// Update is called once per frame
void Update () {
}
//--------------------------- Event ---------------------------
void OnJoyStickBegin(Vector2 vec) {
}
void OnJoyStickMove(Vector2 vec) {
//設(shè)置角色朝向
Quaternion q = Quaternion.LookRotation (new Vector3 (vec.x, 0, vec.y));
transform.rotation = q;
//移動(dòng)角色并且播放奔跑動(dòng)畫
transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);
}
void OnjoyStickEnd() {
}
}