unity跟 android的互動,網路上有些教學是建立 AndroidManifest.xml 還有同包名的 jar檔,放進 Unity然後再壓出來。其實跟本不用那麼麻煩,可以先壓好 unity的 android專案,然後再將 jar檔放進 lib資料夾底下就行了。所以只要先建立好方法, jar包可以隨時替換。
unity跟 android的互動,網路上有些教學是建立 AndroidManifest.xml 還有同包名的 jar檔,放進 Unity然後再壓出來。其實跟本不用那麼麻煩,可以先壓好 unity的 android專案,然後再將 jar檔放進 lib資料夾底下就行了。所以只要先建立好方法, jar包可以隨時替換。
為了版本切換,想在手機加個文件做切換使用。使用Unity的Application提供的方法很不方便,位置被綁死。
還好 c#的 File在android上還有做用,要不然使用android裡的File還要經過一次 jar包,非常麻煩。
當我們要複製文字時,unity的內建類別 TextEditor在 android裡是沒做用的,所以我們必需寫個jar包讓unity去調用 android的剪貼簿。
以下為 android上的代碼
1.編寫 Shader, 這裡定義了3個變量,其中_MainTex代表背景貼圖,_Width代表顯示背景的百分比,_Distance代表當前滾動的距離。核心代碼為“i.uv.x = frac(i.uv.x*_Width + _Distance);”,其中frac是取小數的函數,如1.23 取出來是0.23,其功能是將i.uv.x 控制在0到1的範圍,進而顯示出來。
Shader "Lpy/ImageRoll" { Properties { _MainTex("Main Tex", 2D) = "white" {} _Width("Width", float) = 0.5 _Distance("Distance", float) = 0 } SubShader { Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Pass { Tags{ "LightMode" = "ForwardBase" } ZTest off ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float _Width; float _Distance; struct a2v { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; v2f vert(a2v v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv.x = v.texcoord.x; o.uv.y = v.texcoord.y; return o; } fixed4 frag(v2f i) : SV_Target { i.uv.x = frac(i.uv.x*_Width + _Distance); fixed4 c = tex2D(_MainTex, i.uv); return c; } ENDCG } } FallBack "Transparent/VertexLit" }
以下為 ScrollView物件循環腳本,有註記就不多做解釋了
using UnityEngine; using System.Collections.Generic; public class Loop : MonoBehaviour { public List prefab; // grid裡的所有物件 public UIScrollView scrollview; private List child; private List intlist; // 資料 float move = 110; // 移動距離 bool b; // 是否開始拖動 void Start () { child = new List(); // 註冊 grid裡的所有物件 for (int i = 0; i < transform.childCount; i++) { Elements e = new Elements(); e.widget = transform.GetChild(i).GetComponent(); e.index = i; child.Add(e); } intlist = new List(); for(int i=1;i<21;i++)intlist.Add(i); // 註冊 ScrollView拖動事件 scrollview.onDragStarted = DragStart; // 開始 scrollview.onDragFinished = DragEnd; // 結束 } void DragStart() { b = true; } void DragEnd() { b = false; } void Update () { if (!b) return; // 是否開始拖動 // 當元素 1與 2為不可見,代表正在往下滑 // 偵測是否缺下一筆資料 if (child[0].widget.isVisible == false && child[0].widget.isVisible == false) { Elements u = child[0]; // 如過預取得資料位置沒超出 if (child[0].index + prefab.Count < intlist.Count) { // 重新定位該元素 Transform tt = child[0].widget.transform; tt.localPosition = new Vector3(tt.localPosition.x, tt.localPosition.y - move * prefab.Count, tt.localPosition.z); // 元素資料改變 u.index += prefab.Count; // 更新現在資料位置 u.widget.transform.GetChild(0).GetComponent().text = intlist[u.index].ToString(); // 元素資料傳遞 // 元素順序改變 child.RemoveAt(0); child.Add(u); } } // 當元素 1可見,倒數第1 與倒數 2為不可見,代表可往上滑 // 偵測是否缺上一筆資料 else if (child[0].widget.isVisible == true && child[child.Count - 1].widget.isVisible == false && child[child.Count - 2].widget.isVisible == false) { Elements u = child[prefab.Count-1]; // 如過有預取得資料位置 if (u.index - prefab.Count > -1) { Transform tt = child[prefab.Count - 1].widget.transform; tt.localPosition = new Vector3(tt.localPosition.x, tt.localPosition.y + move * prefab.Count, tt.localPosition.z); // 元素資料改變 u.index -= prefab.Count; // 更新現在資料位置 u.widget.transform.GetChild(0).GetComponent().text = intlist[u.index].ToString(); // 元素資料傳遞 // 元素順序改變 child.RemoveAt(prefab.Count - 1); child.Insert(0, u); } } } struct Elements { public UIWidget widget; // 該元素的 UIWidget public int index; // 資料位置 } }
Screen Space(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。
ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。(用的不多,反正我暂时没有用到~呵呵~)
實現當滑鼠移出螢幕時,移動遊戲畫面
void Update () { // 當滑鼠將滑到螢幕外 if (Input.mousePosition.y + 12 > Screen.height) moveCamera.position += Vector3.forward * 0.5f; else if(Input.mousePosition.y - 12 < 0) moveCamera.position -= Vector3.forward * 0.5f; if (Input.mousePosition.x + 12 > Screen.width) moveCamera.position -= Vector3.left * 0.5f; else if(Input.mousePosition.x - 12 < 0) moveCamera.position += Vector3.left * 0.5f; }
由 Input.mousePosition取得滑鼠在螢幕上位置,再由 Screen.width與 Screen.height取得螢幕最大的 XY來做比較