2014年12月8日 星期一

Unity:使用 Render Texture 製作小地圖

在之前曾發表的文章「Unity:製作雷達小地圖」的結尾有提到過該做法的一些可能缺點,而不管面對任何需求,通常也不是只有一種做法,如果使用的 Unity 是 Pro 版的話,其實我們也可以利用 Render Texture 來製作小地圖。

有關 Render Texture 的相關介紹,我們可以參考官方文件說明 http://docs.unity3d.com/Manual/class-RenderTexture.html,它的簡單用法就是以下幾個步驟:
  1. 在 Project view 中的 Create 選單或是按滑鼠右鍵中的 Create 選單中選擇 Render Texture 建立一個 Render Texture 檔案。
  2. 在 Hierarchy view 的 Create 選單選擇 Camera 或者在主選單列選擇 GameObject > Camera 在場景中建立新的鏡頭。
  3. 選擇剛剛建立的鏡頭,並將剛剛建立的 Render Texture 檔案拉到 Inspector view 上的 Target Texture 欄位。
如此,這個新建立的鏡頭所看到的內容就會畫到這個 Render Texture 上,且會隨這鏡頭內容的變化改變 Textrue 的內容,那麼這個 Render Texture 接下來就可以當作一般 Texture 來提供給 Material 或 GUI 使用。

瞭解了 Render Texture 基本的工作流程之後,就可以開始使用它來製作小地圖,但在那之前還有幾個準備動作,因為我們想製作非矩形的小地圖,所以還是需要製作遮罩這一類的前置準備動作,與「Unity:製作雷達小地圖」一文所不同的是,並非製作簍空的平面模型作為遮罩用,而只需要一張黑白相間的圖片即可,這在修改遮罩時會方便很多,當然,要做這類特殊的功能,也是需要另外寫一個 Shader,所以我們先從 Project view 使用 Create 選單選擇 Shader 來建立 Shader 檔並將它開啟,將內容改為如下這樣:

Shader "Custom/MaskScreen" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Mask ("Mask Texture", 2D) = "white" {}
    }
    SubShader {

        Tags {"Queue"="Transparent"}

        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha

        Pass{
            SetTexture [_Mask] {combine texture}
            SetTexture [_MainTex] {combine texture, previous}
        }
    }
}

瞭解 Render Texture 之後,又有了遮罩圖片以及 Shader,就可以開始製作小地圖。

黑白相間的遮罩圖
首先,先在場景中找一個離 Main Camera 遠一點的位置建立一個 Quad 或 Plane (Hierarchy view 的 Create menu 選擇 3D Object > Quad 或 3D Object > Plane),命名為 SmallMap,並給它設置一個帶有小地圖圖片的 Material;這裏需要離 Main Camera 遠一點的位置,主要是不希望讓它直接顯示在 Main Camera 的畫面上,所以直接放置在 Main Camera 的後面也可以。

接下來,就要製作 Render Texture,所以先在 Project view 的 Create menu 選擇 Render Texture 建立個 Render Texture 資源檔並命名為 SmallMapViewTexture。



回到場景中,在已建立好的 SmallMap 前面建立一個新的 Camera(Hierarchy view 的 Create menu 選擇 Camera),將這個 Camera 命名為 SmallMapCamera,並使 SmallMapCamera 正對 SmallMap,接下來將剛剛建立的 SmallMapViewTexture 設置到 SmallMapCamera 的 Target Texture 欄位,此時如果選取 Project view 的 SmallMapViewTexture 可以在 Inspector view 下方的預覽圖看到 SmallMapCamera 所看到的內容。

建立 SmallMapCamera 正對著 SmallMap
將 SmallMapViewTexture 設置到 SmallMapCamera 的 Target Texture 欄位
SmallMapViewTexture 預覽圖是 SmallMapCamera 所看到的內容
到這裡,小地圖的 Texture 算是已經完成,可以稍微移動 SmallMap 或 SmallMapCamera 的位置,可以觀察到 SmallMapViewTexture 的內容也會跟隨改變。

既然小地圖的 Texture 已經完成,那麼,就可以開始製作真正要呈現在遊戲畫面上的小地圖。首先,在場景中 Main Camera 看得到的位置建立一個 Quad 或 Plane,命名為 SmallMapView,然後在 Project view 建立一個 Material 命名為 MaskScreen,並將 MaskScreen 的 Shader 設置為我們前面自己製作的 Shader(Custom/MaskScreen),此時在 Inspector view 應該可以看到 MaskScreen 有兩個可以設置 Texture 的欄位,請將 Base (RGB) 欄位放入 SmallMapViewTexture,Mask Texture 欄位放入自行製作用來作為遮罩的黑白圖,請注意這張黑白圖的設置中必須勾選 Alpha from Grayscale。

選擇自製的 Shader - Custom/MaskScreen
記得做為遮罩的圖要勾選 Alpha from Grayscale
將 MaskScreen 設置到 SmallMapView 之後可以在 Scene view 發現 SmallMapView 貼上了 SmallMapViewTexture 的內容,同時也被遮擋掉不希望看到的部分,如果 SmallMapView 與 Main Camera 的相對位置正確的話,應該也可以同時看到 Game view 上出現的小地圖不再是矩形的。
地圖邊緣已經被遮擋掉
Game view 看見的圓形小地圖
如此,小地圖已告完成,我們可以類似「Unity:製作雷達小地圖」那樣在 SmallMapView 與 Main Camera 中間插入個光圈來裝飾小地圖的邊緣。不過,在此由於我們使用黑白圖作為遮罩,所以,其實我們可以直接將黑白圖的黑白相間的部位改模糊一點,那麼就可以直接讓小地圖的邊緣有點淡出的效果。或者,希望小地圖呈現稍微有點半透明,直接從這個作為遮罩的黑白圖去下手,就看實際需求時如何應用囉!

換一張邊緣模糊的遮罩圖
小地圖的周圍有點淡出
小地圖稍微半透明

P.S. 使用 Unity 版本為 4.6.0f3。