unity跟 android的互動,網路上有些教學是建立 AndroidManifest.xml 還有同包名的 jar檔,放進 Unity然後再壓出來。其實跟本不用那麼麻煩,可以先壓好 unity的 android專案,然後再將 jar檔放進 lib資料夾底下就行了。所以只要先建立好方法, jar包可以隨時替換。


 

初學者日記 發表在 痞客邦 留言(0) 人氣()

寫了小工具,將excel檔案自動轉換成ScriptableObject。給有用到ScriptableObject的人參考或使用

代碼放在Github上

初學者日記 發表在 痞客邦 留言(0) 人氣()

為了版本切換,想在手機加個文件做切換使用。使用Unity的Application提供的方法很不方便,位置被綁死。

還好 c#的 File在android上還有做用,要不然使用android裡的File還要經過一次 jar包,非常麻煩。

初學者日記 發表在 痞客邦 留言(0) 人氣()

當我們要複製文字時,unity的內建類別 TextEditor在 android裡是沒做用的,所以我們必需寫個jar包讓unity去調用 android的剪貼簿。

以下為 android上的代碼

初學者日記 發表在 痞客邦 留言(0) 人氣()

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"
}

 

初學者日記 發表在 痞客邦 留言(0) 人氣()

foreach因為BUG的關係每次生使用都會產生垃圾而產生CG,雖然在 5.3版修好了。

如果因為一些關係而使用舊版本,可以用以下方法替代 foreach,可以避免GC的產生。

初學者日記 發表在 痞客邦 留言(0) 人氣()

以下為 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;  // 資料位置
  }
}


初學者日記 發表在 痞客邦 留言(0) 人氣()

  1. World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。            
  2. Screen Space(屏幕坐标:以像素来定义的,以屏幕的左下角为(00)点,右上角为(Screen.widthScreen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。

  3. ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(00)点,右上角为(11)点,Z的位置是以相机的世界单位来衡量的。(用的不多,反正我暂时没有用到~呵呵~)

文章標籤

初學者日記 發表在 痞客邦 留言(0) 人氣()

實現當滑鼠移出螢幕時,移動遊戲畫面

        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來做比較

文章標籤

初學者日記 發表在 痞客邦 留言(0) 人氣()

首先到以下官網下載 dll檔:

http://exceldatareader.codeplex.com/

文章標籤

初學者日記 發表在 痞客邦 留言(0) 人氣()

1 2