嗚嗚喔學習筆記

搜尋此網誌

2017年5月2日 星期二

UnityShader初體驗 - 法向量 , 跟RGB的關係的理解

x,y,z 坐標系 由圖可以知道 Unity 裡
右邊->X
上面->Y
深度->Z
「unity x y z」的圖片搜尋結果

那我們也知道顏色 RGB 使用類似的方式儲存資訊 

(r,g,b)


那如果我們把 一顆球的顏色 用 法向量取代會發生什麼事情呢?

因為
(x,y,z) <-> (r,g,b)

已這樣的對應關係 

大膽猜出 一顆圓的頂端 會是綠色
因為

頂端的法向量值 -> (x,y,z) => (0,1,0) => (r,g,b) 綠色

右方的法向量值 -> (x,y,z) => (1,0,0) => (r,g,b) 紅色

前方的法向量值 -> (x,y,z) =>(0,0,1) => (r,g,b) 藍色


那我實際看看結果圖 


那證明這樣的推論是對的 上方是綠色 , 右方是紅色
換個角度再看一次


這次換到對面看 那這樣可以看到 正面藍色 上方綠色 左方紅色 
也符合邏輯

那就看一下程式碼


這裡的實作就是把每個顏色 
使用 
法向量的值取代 
o.color = v.normal 



2017年4月9日 星期日

Unity ObjectPool 物件池

再生成物件時 常常要大量創建跟銷毀
這樣很浪費效能 (比如說子彈之類的)

比較合理的做法可以做一個物件池
來回收資源再利用 (資源回收?)~

程式碼:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public class ObjectPool
{
public Transform _parent = null;
private Queue<GameObject> _pool = new Queue<GameObject>();
private GameObject _prefab = null;
public ObjectPool(GameObject prefab, Transform parent = null)
{
_parent = parent;
_prefab = prefab;
}
public GameObject Spwan()
{
GameObject result = null;
if (_pool.Count > 0)
result = _pool.Dequeue();
else
result = UnityEngine.Object.Instantiate(_prefab);
result.gameObject.SetActive(true);
if (_parent)
result.transform.SetParent(_parent);
return result;
}
public T Spwan<T>() where T : Component
{
return Spwan() as T;
}
public void Despwan(GameObject go)
{
_pool.Enqueue(go);
go.SetActive(false);
}
}
使用方式


_objectPool = new ObjectPool(_prefab, _parent);
var go = _objectPool.Spwan(); -> 拿出來用 , 如果沒有的話 幫妳複製一個新的
_objectPool.Despwan(go); -> 不要用的東西丟回去池子裡


2017年3月29日 星期三

Unity Android Device Debug

Android 實機 Debug 連線到電腦上 這很重要 在下面記錄步驟

1. 先找到Andoird SDK路徑 (沒安裝的話可以去Google)



2. 開啟SDK Manager (找到Google USB Driver 安裝他)



3. 找到 Tools 底下的monitor 開啟他


4. 插上線 , 或是用模擬器之類的就會看到下面的DebugLogger 了
(紅框框可以選擇裝置 然後下面是Log們)

5. 另外可以設定  篩選 Unity Log



補充 : Android Studio 3.3.1 版本的 SDK Monitor路徑有改動改到 Sdk/Tools/lib/monitor-x86_64/




2017年3月21日 星期二

C# - Event

using System;

namespace EventTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Ball b = new Ball();

            b.FlyEvent += BallFlyHandler;
           
            b.FlyEvent += delegate ()
            {
                Console.WriteLine("Catch Ball Fly Event delegate");
            };
            b.FlyEvent += () =>
            {
                Console.WriteLine("Catch Ball Fly Event 匿名函式");
            };
            b.Throw();

            Console.ReadLine();
        }

        private static void BallFlyHandler()
        {
            Console.WriteLine("Catch Ball Fly Event BallFlyHandler");
        }
    }

    class Ball
    {  
        public event Action FlyEvent = null;

        public void Throw()
        {
            if (FlyEvent != null)
                FlyEvent();
        }
    }

}

2017年3月7日 星期二

單例模式 X Singleton X C#

單例模式 
主要功能有兩個

1. 只存在一個 -  永遠只有自己很孤獨 所以取名叫singleton
2. 懶惰創建 - 在使用之前都不會被創建 , 一直到有人使用才創建 可以減少消耗

程式碼

      public class Singleton  
      {  
           private static Singleton _instance = null;  
           private Singleton()  
           {  
           }  
           public static Singleton Instance()  
           {  
                if (_instance == null)  
                {  
                     _instance = new Singleton();  
                }  
                return _instance;  
           }  
      }  

2017年3月1日 星期三

Virtual Studio X Perforce

step1. NetGet 下載插件 P4VS



step2. 說明右邊 點選右鍵 選擇 p4 Connection




step3. 出現 Connection 設定視窗 選New Connection



step4. 輸入P4設定  完成~~

2016年12月6日 星期二

好文分享 你搞懂抽象類別別與介面了嗎?

我一直搞不清楚 Interface abstract 的差異 跟使用的方向 偶然看到一篇好文在此分享一個

我為下面文章做個總結:

Abastract => 是一個 => 皮卡丘 是一個神奇寶貝
Interface => 像是一個 , 屬於 => 皮卡丘 像是一個雷系 or 屬於雷系

class Abstract 神奇寶貝 { ... }
Interface 雷系 { ... }

以這樣來分類結論就是

class 皮卡丘 : 神奇寶貝 , 雷系 { ... }
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------