(轉(zhuǎn))制作虛擬搖桿

轉(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() {
        
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,021評(píng)論 25 709
  • 在此特此聲明:一下所有鏈接均來(lái)自互聯(lián)網(wǎng),在此記錄下我的查閱學(xué)習(xí)歷程,感謝各位原創(chuàng)作者的無(wú)私奉獻(xiàn) ! 技術(shù)一點(diǎn)一點(diǎn)積...
    遠(yuǎn)航的移動(dòng)開發(fā)歷程閱讀 11,542評(píng)論 12 197
  • 獲取相冊(cè)數(shù)據(jù) http://kayosite.com/ios-development-and-detail-of-...
    0271fb6f797c閱讀 1,750評(píng)論 0 1
  • 寶貝蛋圖書漂流程序: 一、每個(gè)孩子交599元,成為寶貝蛋圖書漂流系統(tǒng)的會(huì)員。 二、會(huì)員享有在三年之內(nèi)免費(fèi)看書,并無(wú)...
    蘆葦花開閱讀 466評(píng)論 0 0
  • 前幾天看到非常喜歡的女主播兼女作家小北發(fā)了篇文,說(shuō)是賺錢比找男朋友要重要。 她的中心思想很清楚,就是希望女青年們不...
    周彥霖boy閱讀 705評(píng)論 2 4

友情鏈接更多精彩內(nèi)容