跨平臺的移動和觸控

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 ();? ? ? }? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罐呼,一起剝皮案震驚了整個濱河市鞠柄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫉柴,老刑警劉巖厌杜,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異计螺,居然都是意外死亡夯尽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門登馒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匙握,“玉大人,你說我怎么就攤上這事陈轿∪Ψ模” “怎么了麦射?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛔琅。 經(jīng)常有香客問我半等,道長呐萨,這世上最難降的妖魔是什么莽囤? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮惨远,結(jié)果婚禮上话肖,老公的妹妹穿的比我還像新娘。我一直安慰自己最筒,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布辙培。 她就那樣靜靜地躺著邢锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尾抑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天再愈,我揣著相機與錄音践磅,去河邊找鬼灸异。 笑死羔飞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的么伯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼田柔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欣舵?” 一聲冷哼從身側(cè)響起缀磕,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糟把,沒想到半個月后牲剃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡另锋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年狭归,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片室梅。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡疚宇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出间涵,到底是詐尸還是另有隱情,我是刑警寧澤勾哩,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布思劳,位于F島的核電站,受9級特大地震影響潜叛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜威兜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一椒舵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逮栅,春花似錦、人聲如沸措伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽担败。三九已至,卻和暖如春提前,著一層夾襖步出監(jiān)牢的瞬間吗货,已是汗流浹背宙搬。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工恬口, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人士鸥。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像烤礁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子币砂,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)亿蒸,斷路器掌桩,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法姑食,類相關(guān)的語法,內(nèi)部類的語法音半,繼承相關(guān)的語法,異常的語法煌茬,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • { "Unterminated string literal.": "未終止的字符串文本彻桃。", "Identifi...
    一粒沙隨風飄搖閱讀 10,510評論 0 3
  • { "Unterminated string literal.": "未終止的字符串文本。", "Identifi...
    栗子雨閱讀 7,862評論 0 3
  • ## 可重入函數(shù) ### 可重入性的理解 若一個程序或子程序可以安全的被并行執(zhí)行眠屎,則稱其為可重入的肆饶;即當該子程序正...
    夏至亦韻閱讀 700評論 0 0