2016年9月4日 星期日

Unity_C#_彈孔的製作

*此教學使用Unity 5.4.0f3 (64-bit)免費版
*最後更新時間2016/09/05


本文將教學:
                     彈孔的製作

備註:此範例已經預設讀者已經會移動及發射物件
建議有射線基礎:Unity_C#_Physics.Raycast射線
----------------------------------------------------------------------------------------------------------



1.首先先準備好彈孔透明圖,選幾種不同種類的,例如玻璃和水泥地
例如這張圖,設為Sprite
2.再來新增一Material設為Unlit/Transparent 或其他可帶透明的Shader
並拖曳Sprite過去

3.新增一Plane並把Material指定給它,此時可以看到彈孔已經出現在場景上
縮放適當大小並設為Prefab,場景上的彈孔就可以先刪了
用以上步驟多做幾個彈孔

4.開始新增撰寫腳本如下:

using UnityEngine;
using System.Collections;

public class Bullt_hole_02 : MonoBehaviour {

    public GameObject[] bulletTex; // 建立彈孔陣列
    public GameObject[] bulletTex_Glass; // 建立玻璃彈孔陣列

    void Update()
    {

        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        RaycastHit hit;

        if (Input.GetButtonDown("Fire1") && Physics.Raycast(transform.position, fwd, out hit, 10) && Time.timeScale != 0)
        {
            if (hit.collider.tag == "Glass" || hit.collider.tag == "PlaneLight")
            {   Instantiate(bulletTex_Glass[Random.Range(0, 3)], hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)); }//隨機0、1、2
            else if (hit.collider.tag == "Wall" || hit.collider.tag == "Ground" || hit.collider.tag == "WallLight")
            {
                Instantiate(bulletTex[Random.Range(0, 3)], hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)); // 彈孔之position和rotation會符合被打中的物體
            }
        }
    }
}

由此可知此腳本的判斷是用射線判斷,而射線照理來說是由槍口發出
所以腳本應掛在在槍口位置
而使用標籤(tag)可使打中的物件不同留下不同彈孔
亂數則可以使彈孔不會每次都長一樣

一般射擊遊戲不會讓彈孔永遠存在(佔資源)
可以在彈孔身上掛上Destroy(gameObject, 5f);之類的程式碼


5.再來把腳本拖曳給槍的槍口位置,如效果不理想可以自行新增空物件
設定陣列Size並拖曳每一個Prefab,並為場景的物件加上標籤


6.效果如下(不知道為什麼傳GIF一直失敗):



2016年9月2日 星期五

Unity_C#_開頭動畫的製作

*此教學使用Unity 5.4.0f3 (64-bit)免費版
*最後更新時間2016/09/02


本文將教學:
                     開頭動畫的製作
----------------------------------------------------------------------------------------------------------

有別於Unity_C#_在Unity中播放影片,這次的教學不使用Plane
而使採用UGUI的RawImage來撥放影片
在開始前先準備好影片,
目前Unity支援的影片格式有: .mov、.mpg、.mpeg、.mp4、.avi、.asf

1.首先先新增一個2D場景,並設定Camera為Soild Color和Orthographic
(此步驟其實和播放影片無關,因為一般來說播放開頭動畫就切換場景了,
所以並不需要SkyBox也不須透視)


2.新增一個RawImage,
並把Canvas之Render Mode設為Screen Space - Camera,
UI Scale Mode設為Scale With Screen Size(這樣就不會在不同解析度出現問題)
Reference Resoulution設為此Unity作品最可能使用的螢幕尺寸



3.拖曳Camera至Render Camera位置


4.為了確保RawImage填滿整個畫面,
再Rect Transform按住Alt再選取最右下角的圖示


5.匯入影片(越大匯入越久),直接拖曳至Asset視窗即可,
可調整Quality(品質),理所當然調越高跑越慢


6.開始撰寫腳本如下

在此附上完整程式碼:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]//必須要有AudioSource,任何加上此腳本的物件將自動加入AudioSource
public class OpeningMovie : MonoBehaviour {

    public MovieTexture movTexture;//影片
    private AudioSource AS_mov;//影片音軌

    void Start()
    {
        GetComponent<RawImage>().texture = movTexture;
        AS_mov = GetComponent<AudioSource>();
        AS_mov.clip = movTexture.audioClip;//這個MovieTexture的音軌
        movTexture.Play();
        AS_mov.Play();
    }


    void Update()
    {
        if (!movTexture.isPlaying)
        {
            UnityEngine.SceneManagement.SceneManager.LoadScene("01_Main_Menu");//載入場景
        }
    }
}





7.之後掛上腳本至RawImage,並把MovieTexture拖曳至腳本


8.此時按Play測試,效果如下:

很明顯的,影片播完後在進入下一個場景會直接出現一片空白,
那是因為影片播完時要進入下個場景,但下個場景還沒載入完,
這時很常見的錯誤,一般人不會考慮到這部分,於是要修改腳本

9.問題很明顯出在!movTexture.isPlaying,
當影片播放完後執行,而此時再載入場景已經太晚
這次使用StartCoroutine計時器來計時,
填入適當秒數,當時間到後直接換場景


以下附上完整程式碼:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]//必須要有AudioSource,任何加上此腳本的物件將自動加入AudioSource
public class OpeningMovie : MonoBehaviour {

    public MovieTexture movTexture;//影片
    private AudioSource AS_mov;//影片音軌

    void Start()
    {
        GetComponent<RawImage>().texture = movTexture;
        AS_mov = GetComponent<AudioSource>();
        AS_mov.clip = movTexture.audioClip;//這個MovieTexture的音軌
        movTexture.Play();
        AS_mov.Play();
    }


    void Update()
    {
        StartCoroutine(LoadScene());
    }

    IEnumerator LoadScene()
    {
        yield return new WaitForSeconds(4.5f);//括號內填入影片時間
        UnityEngine.SceneManagement.SceneManager.LoadScene("01_Main_Menu");//載入場景
    }
}


10.實際測試,這次沒有出現空白,完美!




2016年8月23日 星期二

Unity_C#_(基礎)SetActive顯示隱藏物件

*此教學使用Unity 5.4.0f3 (64-bit)免費版
*最後更新時間2016/08/24


本文將教學:
                     顯示隱藏物件
                     SetActive用於判斷式
----------------------------------------------------------------------------------------------------------

SetActive是GameObject的一種方法,可以控制物件的顯示
等於是在Inspector控制是否打勾,有別於Destory會直接消滅物件


寫法為:
GameObject.SetActive(true);
GameObject.SetActive(false);

1.做個練習,先配置UGUI物件如下:



2.依這個介面來看,應是要按下Button才會出現Text,
所以先在Inspector視窗取消勾選


3.新增腳本,程式碼如下,函式給Button使用



4.把腳本拖曳至物件上(我習慣新增一個空物件),並且拖曳GameObject


5.接下來設定按鈕觸發的函式(...以後講解按鈕觸發函式就丟這篇)


6.運行時發現已經可以達到按下按鈕顯示物件的效果了,
但是如果是想要再按一次隱藏呢?
SetActive()用於判斷式使用activeInHierarchy,
所以可以修改函式程式碼如下:


7.效果如下:


如此一來,基本的UI顯示都可以得心應手了

2016年7月29日 星期五

Unity_C#_實用技巧(程式碼縮排、顯示變數屬性、間距、腳本必要屬性)

*此教學使用Unity 5.3.5f1 (64-bit)免費版
*最後更新時間2016/08/18


本文將教學:
                      #Region
                      [Space()]
                      [Header("")]
                      [RequireComponent(typeof())]

----------------------------------------------------------------------------------------------------------

Region

縮短程式碼的好幫手。

1.在你想要縮排的程式碼區塊打上#region和#endregion,效果如下。

2.但是縮牌後只會顯示#region,這會變得不好管理,所以可以在#region後面加上註解方便辨識。


Header

增加可讀性的好幫手。

1.一般來說在Inspector視窗中,設為Public的變數會如下圖

2.此時可以在程式碼增加: [Header("你想註解什麼")]
Header後必須是公開變數

3.就可以在Inspector看見你的註解,
但是很可惜的是只有英文才會變成粗體字

Space

用於管理Inspector視窗的公開變數之間隔

1.以上個範例為例

2.使用效果如下,可見間距被改變

3.上步驟達到改變間距的目的,但效果不理想,
由此可見Space和Header搭配使用必須至於Header之後。


4.Space也可以平時用於公開變數,也可以使用負值(不建議)


[RequireComponent(typeof())]

用於讓腳本掛上的物件自動掛上typeof()括號內的屬性,同時加了此腳本的物件無法移除屬性

1.以下用[RequireComponent(typeof(AudioSource))]舉例,打上之後加入物件


2.效果如下:

3.除非移除腳本才可移除屬性,不然會出現以下警告:



2016年7月15日 星期五

Unity_"免費"插件推薦

*最後更新時間2017/02/19
若找到不錯的插件將更新(免費的真的不好找)
----------------------------------------------------------------------------------------------------------

物理引擎類:

1. Bullet Physics For Unity

十分不錯的物理引擎
 
網址:https://www.assetstore.unity3d.com/en/#!/content/62991

2. Explosion System

爆炸物理引擎

特效類:

1. X-WeaponTrail

用於呈現武器拖尾效果十分不錯的插件
 
網址:https://www.assetstore.unity3d.com/en/#!/content/20972

2. Fire and Spell Effects

實用的火焰粒子特效
 
網址:https://www.assetstore.unity3d.com/en/#!/content/36825

3. Particle Ribbon

大量粒子特效


網址:https://www.assetstore.unity3d.com/en/#!/content/42866

4. KY Magic Effects

魔法類粒子特效

網址:https://www.assetstore.unity3d.com/en/#!/content/21927

5. Fire Explosion VFX

火焰特效














網址:https://www.assetstore.unity3d.com/en/#!/content/48795

6. Inferno VFX

火焰粒子特效















網址:https://www.assetstore.unity3d.com/en/#!/content/50735

範例類:

1. 2D Pack

大量2D遊戲的範例,適合初學者學習

網址:https://www.assetstore.unity3d.com/en/#!/content/18684

2. 3rd Person Controller + Fly Mode

還不錯的第三人稱角色控制器範例
 
網址:https://www.assetstore.unity3d.com/en/#!/content/28647

編輯器類:

1. Fungus

適合初學者的編輯器,程式門檻低
網址:https://www.assetstore.unity3d.com/en/#!/content/34184

2. 2D Forest Designer (FREE)

免費的2D樹叢編輯器,另有付費版本

光源類:

大力推薦!實用好看的光源

https://www.assetstore.unity3d.com/en/#!/content/5

場景類:

1.Nature Starter Kit 1 & Nature Starter Kit 2

兩個還不錯的環境包
https://www.assetstore.unity3d.com/en/#!/content/49962
https://www.assetstore.unity3d.com/en/#!/content/52977

2016年5月21日 星期六

筆記_學長上課_(2015_05_10)

*最後更新時間2016/05/27
----------------------------------------------------------------------------------------------------------
很感謝專題指導老師安排學長來為專題組員上課
也很感謝學長抽空來為我們上課,省了我們要再去摸索的時間
希望看這篇筆記的人都去他們的粉絲團支持一下

Expect Studio

https://www.facebook.com/expectavalon/?fref=ts

筆者的筆記程度其實不怎麼樣,有可能筆誤、認知錯誤、重點遺漏等問題,
所以可能有錯誤,如讀者發現可回覆糾正。
另外這篇筆記會加入筆者自己查的資料、圖片、影片,故持續更新可能性極高。


1.無論做遊戲或動畫都需要注意貼圖,貼圖影響整個模型的"細緻程度"。
  
(圖片來源:http://tombraider.wikia.com/wiki/File:Evolution_of_tomb_raider.jpg)
   由此圖可以看得出古墓奇兵系列遊戲進步的不只是模型本身的進步,貼圖方面也進步很多, 很多細節都是靠貼圖來表現。

   值得一提的是如果你把遊戲的貼圖貼圖拆開來,會發現模型本身其實並不細緻,因為是經過拓樸(TOPO)減面後的遊戲,如果直接把高模放進遊戲裡很容易造成卡頓、不必要的資源浪費(記得建模時根本看不到的地方就把面刪掉),下圖右是低模加上法線貼圖的效果。

(圖片來源:https://www.epicgames.com/unrealtournament/forums/showthread.php?14298-WORKFLOW-Create-a-Low-Poly-model-and-use-RoundedEdge-shader-to-create-High-Poly)

2.貼圖介紹:

   貼圖有以下種類:
   2-1:Diffuse(Colormap)色彩貼圖、漫反射貼圖:
          在3D軟體中直接上的單色貼圖就是Diffuse。

   2-2:Normal map 法線貼圖:
         
         非常重要!常用在低解析度模型,偽裝出高解析度的模型細節。
         做遊戲必要學會的貼圖。
         (補充講義,非常詳細:http://hammerbchen.blogspot.tw/2010/10/normal-map.html)

   2-3:Metal map 金屬貼圖:
         
         (圖片來源:http://artisaverb.info/PBT.html)
         決定金屬的哪個部分要反光。

   2-4:Roughness map 粗糙貼圖:
          
         (圖片來源:http://artisaverb.info/PBT.html)
         決定反光的程度。

   2-5:Height map 高度貼圖:
         貼圖為黑白色,白色部分會往上升,黑色部分會往下凹,
         類似法線貼圖,但效果更顯著。
         以下是利用Height map製作地形的圖例:
 (資料來源:https://en.wikipedia.org/wiki/Heightmap)

   2-6:Light map 發光貼圖:
         選擇發光的地方,塗成淺白色可有自體發光效果。
         沒必要的話不要在遊戲中打太多燈,會佔效能。

         (圖片來源:https://thecreativechris.com/2013/01/22/unity-and-the-beast/)
         左圖直接打一盞光,右圖用Light map,場景大時盡量多用Light map節省效能。
         (補充:Unity中的Light map應用實例:https://viblo.asia/MNT/posts/l5y8RrL6Gob3)
         (補充:直接使用Unity直接製作Lightmap:http://wordpress-tw.marcpov.com/how-to-unity-lightmapping.htm)

   2-7:ID map 定位貼圖:
         讓一張貼圖在模型中定位...不好解釋,直接看圖片:
         
         (圖片來源:http://blender.stackexchange.com/questions/28398/is-there-a-way-to-create-a-color-id-map-in-blender)
         ID Map可節省資源,非常重要!
         (補充影片:https://www.youtube.com/watch?v=P4OwgDUwv-8)

(補充:Crazy Bump,極簡快速製作貼圖的軟體
https://www.facebook.com/notes/%E8%91%89%E7%B9%81%E6%99%9F/crazybump%E6%A5%B5%E7%B0%A1%E6%95%99%E5%AD%B8/474076692691124/)

3.工具介紹:

   3-1:Mixamo:
         架骨架軟體,網址:https://www.mixamo.com/
         幾乎為人型骨架,人物必須建成型T才可使用(腳合併雙臂展開)
         (補充影片:https://www.youtube.com/watch?v=RwD1oX82qx4)

   3-2:MAYA:
         建模做動畫的軟體,但是在專題中主要是用來架骨架、調動作用。
         拆UV畫貼圖等用其他軟體。

   3-3:Keyshot:算美術圖效果非常好的軟體,主要用高模,但電腦顯卡要好。

   3-4:Unfold3D:拆UV很方便的軟體,可改介面(例如改得像MAYA一樣),需要轉成.obj檔才可使用。

   3-5:TopoGun:拓樸減面用軟體,做遊戲絕對必須學會,一般來說Topo完後約3000~5000面。

   3-6:Substance Painter:畫貼圖用軟體,所畫的貼圖和匯進Unity中幾乎一模一樣,遊戲美術必須學會。
         (補充影片:https://www.youtube.com/watch?v=mB8JqoMIZTQ)

   3-7:Substance Designer:強大的材質編輯軟體。

   3-8:World machine:建立大自然地形的好軟體。
          (網址:http://www.world-machine.com/)

4.工作流程:
   (文字太難解釋了直接做圖)

   工作流程沒有一定,每組可能有各自最適合的工作流程。
   時間也會改變工作流程,例如軟體一更新,有些原本需要的步驟變得不需要(例如這裡面就沒看到Substance Designer)。

5.Unity插件推薦:

  5-1:Relief Terrain Pack:地形材質包。
  5-2:TerrainComposer:隨機產生石頭和樹木(不用浪費時間一個一個擺)。
  5-3:SpeedTree for Unity:樹木產生器(樹會隨風搖擺)。
  5-4:Natural pack:大自然素材
  5-5:Real Water:水。
  5-6:SE Natural Bloom & Dirty Lens:燈光插件、可產生類似Unreal的光影效果。
  5-7:Realistic Effects:非常強大好用的粒子特效。
  5-8:X-WeaponTrail(免費):武器拖尾系果。

6.注意事項/叮嚀:

6-01:規劃關卡時記得不要讓玩家迷路,每個場景不要都太相近,會讓玩家繞圈圈。學會引導玩家,例如一大堆門中,只有一扇門上有燈,玩家就會走過去。

6-02:建立關卡地圖時,先把地圖動線畫好在開始製作,避免時間浪費。例如:先建出關卡來了,但是建了一堆玩家根本不會走的地方。

6-03:遊戲中會大量出現的敵人,大約3000面就好,

6-04:建骨架時記得腳部一定是IK。

6-05:做遊戲記得AI的動作先想好再建,避免不必要的時間浪費。

6-06:盡量不要使用Unity的內建燈光,非常醜,建議使用Asset Store的插件,有插件可達到UnReal的效果(SE Natural Bloom & Dirty Lens)。

6-07:展覽時,如非必要,別用自己的電腦,因為非常操。

6-08:製做遊戲最可怕的是當你開始把做遊戲當成一份工作、作業。怎麼一直保持熱情是一項挑戰。

6-09:製作專題遊戲時,幾乎可確定不可能全部場景都自己建(盡量增加同一物件在場景中出現次數),時間體力有限,需要買插件。

6-10:觀察結果,左右兩個叉路,玩家愛往左邊走。

6-11:美術在畫建模草稿時記得告訴建模哪些部位可以動。

6-12:盡量不要用Unity的內建地形產生器,效果非常差。

6-13:參展很重要,一定要參展,看到不同作品才能知道有各種不同的想法。

6-14:要訂目標,沒目標沒有很難有動力。

6-15:要往遊戲走的,要去台北開發者論壇,台北開發者展、台北資訊展。

6-16:Unity中如果只有一個平面但Collider很多面,直接刪掉Collider後再加Box Collider拉大。

6-17:身為組長不該有太多的情緒。

6-18:很多比賽都不會有人告知,要自己去尋找參加。

6-19:未來趨勢:手機遊戲開發引擎仍為Unity為主要市場、大型遊戲以更強大的Unreal為主。特別是Unreal近期變為免費,未來展覽中會越來越常看到。

6-20:算圖時的電腦頂多開瀏覽器上網,不適合繼續工作。