1. 程式人生 > >Unity3d進階學習(1)--遊戲搖桿

Unity3d進階學習(1)--遊戲搖桿

  1. 實現原理:
    它的原理就是利用ScrollRect來限制搖塊的搖動區域,但是ScrollRect是矩形的,我們的搖桿的搖動區域應該是個圓形的才對。所以順著這個思路我們可以寫個類繼承ScrollRect,自己稍做處理就ok

  2. 例項展示:
    如下圖所示, ScrollCircleMove就是搖桿的背景, 裡面的Image就是搖桿塊。
    這裡寫圖片描述

  3. 程式碼演示:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public
class ScrollCircleMove : ScrollRect { public float m_Speed = 10f; public GameObject m_Player; private Animator m_Animator; private Vector3 m_PlayerDir;//搖桿方向 private bool m_bDrag = false; protected float m_Radius = 0f; protected override void Start() { base.Start(); // 能移動的半徑 = 搖桿的寬 * Dis
m_Radius = (transform as RectTransform).sizeDelta.x * 0.5f; m_Player = GameObject.FindGameObjectWithTag("Player"); m_Animator = m_Player.GetComponent<Animator>(); m_Speed = 5f; } public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData) { base
.OnDrag(eventData); // 獲取搖桿,根據錨點的位置 var contentPostion = this.content.anchoredPosition; // 判斷搖桿的位置 是否大於 半徑 if (contentPostion.magnitude > m_Radius) { // 設定搖桿最遠的位置 contentPostion = contentPostion.normalized * m_Radius; SetContentAnchoredPosition(contentPostion); } // 獲取搖桿方向 m_PlayerDir = content.anchoredPosition.normalized; } public override void OnBeginDrag(PointerEventData eventData) { base.OnBeginDrag(eventData); m_bDrag = true; m_Animator.SetBool("Move", true); } public override void OnEndDrag(PointerEventData eventData) { base.OnEndDrag(eventData); m_bDrag = false; m_Animator.SetBool("Move", false); } void Update() { if (m_bDrag) { m_Player.GetComponent<Rigidbody>().MovePosition(m_Player.transform.position + new Vector3(m_PlayerDir.x, 0, m_PlayerDir.y) * Time.deltaTime * m_Speed); } } }