Unity3D 支持多平臺的發(fā)布含友,但是平時在測試的過程中往往需要在各個平臺之間進行切換替裆,在平時開發(fā)中校辩,對象的移動、舞臺縮放使用鼠標控制比較方便辆童,但是在安卓平臺宜咒,鼠標就無法發(fā)揮作用了,只能使用觸控操作把鉴,最近整理了兩種控制器故黑,適用于桌面以及安卓平臺。
最終使用代碼如下:
using UnityEngine;? using System.Text;? using System.Collections.Generic;? ? public class ControllerObject : MonoBehaviour? {? ? ? public UILabel uiLabel;? ? ? private PlatformController controller;? ? ? ? private IListtextList;? ? ? ? void Awake()? ? ? {? ? ? ? ? this.textList = new List();? ? ? ? ? #if UNITY_STANDALONE_WIN? ? ? ? ? ? ? controller = this.gameObject.AddComponent();? ? ? ? ? #elif UNITY_ANDROID? ? ? ? ? ? ? controller = this.gameObject.AddComponent();? ? ? ? ? #endif? ? ? ? ? ? controller.Init (OnBeginEndCallback, OnMoveCallback, OnScaleCallback, OnUpdateCallback, OnEndCallback);? ? ? }? ? ? ? private void OnBeginEndCallback()? ? ? {? ? ? ? ? this.uiLabel.text = "開始";? ? ? }? ? ? ? private void OnMoveCallback(Vector2 direction)? ? ? {? ? ? ? ? if(this.textList.Count > 10)? ? ? ? ? {? ? ? ? ? ? ? this.textList.RemoveAt(0);? ? ? ? ? }? ? ? ? ? this.textList.Add("移動:" + direction.x + ":" + direction.y);? ? ? ? ? this.uiLabel.text = this.GetText ();? ? ? }? ? ? ? private void OnScaleCallback(float distance)? ? ? {? ? ? ? ? if(this.textList.Count > 10)? ? ? ? ? {? ? ? ? ? ? ? this.textList.RemoveAt(0);? ? ? ? ? }? ? ? ? ? this.textList.Add("縮放:" + distance);? ? ? ? ? this.uiLabel.text = this.GetText ();? ? ? }? ? ? ? private void OnUpdateCallback()? ? ? {? ? ? ? }? ? ? ? private void OnEndCallback()? ? ? {? ? ? ? ? this.uiLabel.text = "結(jié)束";? ? ? }? ? ? ? private string GetText()? ? ? {? ? ? ? ? StringBuilder stringBuilder = new StringBuilder ();? ? ? ? ? ? foreach(string text in this.textList)? ? ? ? ? {? ? ? ? ? ? ? stringBuilder.Append(text);? ? ? ? ? ? ? stringBuilder.Append("\n");? ? ? ? ? }? ? ? ? ? ? return stringBuilder.ToString ();? ? ? }? }? 下面是各個類的代碼:TouchCallback.csusing UnityEngine;using System.Collections;////// 觸碰回調(diào)函數(shù)
///public class TouchCallback{// 開始回調(diào)函數(shù)庭砍,(按鈕按下倍阐、觸碰)觸發(fā)一次public delegate void Begin();// 移動回調(diào)函數(shù),移動時觸發(fā)public delegate void Move(Vector2 direction);// 縮放回調(diào)函數(shù)逗威,縮放時觸發(fā)public delegate void Scale(float distance);// 結(jié)束回調(diào)函數(shù)峰搪,(按鈕松開,觸離)觸發(fā)一次public delegate void End();// 更新回調(diào)函數(shù)凯旭,每偵觸發(fā)public delegate void Update();}[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片using UnityEngine;? using System.Collections;? ? ////// 平臺控制器
///public class PlatformController : MonoBehaviour? {? ? ? protected TouchCallback.Begin beginCallback;? ? ? protected TouchCallback.Move moveCallback;? ? ? protected TouchCallback.Scale scaleCallback;? ? ? protected TouchCallback.Update updateCallback;? ? ? protected TouchCallback.End endCallback;? ? ? ? ////// 初始化回調(diào)函數(shù)
//////Begin callback.? ? ? ///Move callback.? ? ? ///Scale callback.? ? ? ///Update callback.? ? ? ///End callback.? ? ? public virtual void Init(TouchCallback.Begin beginCallback, TouchCallback.Move moveCallback, TouchCallback.Scale scaleCallback, TouchCallback.Update updateCallback, TouchCallback.End endCallback)? ? ? {? ? ? ? ? this.beginCallback = beginCallback;? ? ? ? ? this.moveCallback = moveCallback;? ? ? ? ? this.scaleCallback = scaleCallback;? ? ? ? ? this.updateCallback = updateCallback;? ? ? ? ? this.endCallback = endCallback;? ? ? }? }? [csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片using UnityEngine;? using System.Collections;? ? ////// 鼠標控制器
///public class MouseController : PlatformController? {? ? ? ? /// 鼠標枚舉? ? ? enum MouseTypeEnum? ? ? {? ? ? ? ? LEFT = 0? ? ? }? ? ? ? ////// 縮放距離
///private float scrollDistance;? ? ? ? ////// 鼠標按住狀態(tài)
///private bool mousePressStatus;? ? ? ? void Update()? ? ? {? ? ? ? ? // 按下鼠標概耻、軸? ? ? ? ? if (Input.GetMouseButtonDown ((int)MouseTypeEnum.LEFT))? ? ? ? ? {? ? ? ? ? ? ? this.mousePressStatus = true;? ? ? ? ? ? ? // 觸發(fā)開始回調(diào)函數(shù)? ? ? ? ? ? ? if(this.beginCallback != null) this.beginCallback();? ? ? ? ? }? ? ? ? ? // 松開鼠標、軸? ? ? ? ? if (Input.GetMouseButtonUp ((int)MouseTypeEnum.LEFT))? ? ? ? ? {? ? ? ? ? ? ? this.mousePressStatus = false;? ? ? ? ? ? ? // 觸發(fā)結(jié)束回調(diào)函數(shù)? ? ? ? ? ? ? if(this.endCallback != null) this.endCallback();? ? ? ? ? }? ? ? ? ? // 如果鼠標在按住狀態(tài)? ? ? ? ? if (this.mousePressStatus)? ? ? ? ? {? ? ? ? ? ? ? // 觸發(fā)移動回調(diào)函數(shù)? ? ? ? ? ? ? if(this.moveCallback != null) this.moveCallback(new Vector2(Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse Y")));? ? ? ? ? }? ? ? ? ? // 鼠標滾輪拉近拉遠? ? ? ? ? this.scrollDistance = Input.GetAxis ("Mouse ScrollWheel");? ? ? ? ? // 觸發(fā)縮放回調(diào)函數(shù)? ? ? ? ? if (this.scrollDistance != 0f && this.scaleCallback != null) this.scaleCallback(this.scrollDistance);? ? ? ? ? ? // 觸發(fā)每幀執(zhí)行更新? ? ? ? ? if (this.updateCallback != null) this.updateCallback ();? ? ? }? }? [csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片using UnityEngine;? using System.Collections;? ? ////// 觸碰控制器
///public class TouchController : PlatformController? {? ? ? ////// 修正比例
///private float rate = 50f;? ? ? ? ////// 觸點一
///private Touch oneTouch;? ? ? ? ? ? ////// 觸點二
///private Touch twoTouch;? ? ? ? ? ? ////// 最后一次縮放距離
///private float lastScaleDistance;? ? ? ? ? ? ////// 當前縮放距離
///private float scaleDistance;? ? ? ? void Update()? ? ? {? ? ? ? ? // 如果只有一個觸點? ? ? ? ? if (Input.touchCount == 1)? ? ? ? ? {? ? ? ? ? ? ? this.oneTouch = Input.touches[0];? ? ? ? ? ? ? // 觸點開始? ? ? ? ? ? ? if(this.oneTouch.phase == TouchPhase.Began)? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? // 觸發(fā)開始回調(diào)函數(shù)? ? ? ? ? ? ? ? ? if(this.beginCallback != null) this.beginCallback();? ? ? ? ? ? ? }? ? ? ? ? ? ? // 觸點移動? ? ? ? ? ? ? else if(oneTouch.phase == TouchPhase.Moved)? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? // 觸發(fā)移動回調(diào)函數(shù)? ? ? ? ? ? ? ? ? if(this.moveCallback != null) this.moveCallback(new Vector2(this.oneTouch.deltaPosition.x, this.oneTouch.deltaPosition.y) / this.rate);? ? ? ? ? ? ? }? ? ? ? ? ? ? // 觸點結(jié)束? ? ? ? ? ? ? else if(oneTouch.phase == TouchPhase.Ended)? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? // 觸發(fā)結(jié)束回調(diào)函數(shù)? ? ? ? ? ? ? ? ? if(this.endCallback != null) this.endCallback();? ? ? ? ? ? ? }? ? ? ? ? }? ? ? ? ? // 如果有多個觸點? ? ? ? ? if(Input.touchCount > 1)? ? ? ? ? {? ? ? ? ? ? ? this.oneTouch = Input.touches[0];? ? ? ? ? ? ? this.twoTouch = Input.touches[1];? ? ? ? ? ? ? // 如果是縮放? ? ? ? ? ? ? if(oneTouch.phase == TouchPhase.Moved && twoTouch.phase == TouchPhase.Moved)? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? this.scaleDistance = Vector2.Distance(this.oneTouch.position, this.twoTouch.position);? ? ? ? ? ? ? ? ? // 觸發(fā)縮放回調(diào)函數(shù)? ? ? ? ? ? ? ? ? this.scaleCallback((this.scaleDistance - this.lastScaleDistance) / this.rate);? ? ? ? ? ? ? ? ? this.lastScaleDistance = this.scaleDistance;? ? ? ? ? ? ? }? ? ? ? ? }? ? ? ? ? // 觸發(fā)每幀執(zhí)行更新? ? ? ? ? if (this.updateCallback != null) this.updateCallback ();? ? ? }? }