1. 程式人生 > >[unity3d]設定3D模型顯示在2D背景之前(多個相機分層顯示)

[unity3d]設定3D模型顯示在2D背景之前(多個相機分層顯示)

好一段時間沒寫部落格了,新年來第一天正式上班,新的一年裡要求自己有新的變化,堅持每天不斷的學習和提高,改變過去的晚睡晚期的不好習慣,昨天週末,利用一天休息時間去打打籃球,發現過去三個月裡每天熬夜到深夜,發現體質明顯下降,今天起來發現渾身痠痛,得調整一下作息和生活,堅持鍛鍊,堅持早睡早起,早晨起來每天都堅持看一小時的書,如果每天都堅持在某個時間段固定去學一樣東西,時間一長,一週或者一個月甚至一年下來你會驚訝的發現原來你自己學了那麼多,貴在堅持,每個人都知道,但真真能做到的人比較少,如果能做到這點,就算將來即便成不了大牛那也是一直走在成為大牛做過的路上,也會受益匪淺,我寫上這個也是自我勉勵,另一方面也是大家共勉,生活上,學習上的點點滴滴總是那麼神奇,過去未知答案時所走出的道路在未來的這天,發覺將其串聯起來,現在所走的路不知道是何路,但必是將來通向未來之路,因不滿足於現狀,覺得可以做的更好,所以,通過不斷的努力,去改變現狀,一直不想當一個井底之蛙,IT技術上更是如此,如果僅僅是安於現狀,那永遠是跟不上時代的步伐,只會不進則退。不知何時開始,我有了自己的追求,有一股勁兒,一直想做的更好,學的更多,相信有一天能成為一個參天大樹。假如拋開一切的負擔,你最在乎的是什麼?或者說你最想做的事是什麼?燃氣你的激情,為理想而奮鬥。實現理想的過程是艱辛的,但如果一旦實現,發現時甜蜜的,理想or夢想,但他們不是夢,並不是遙不可及,用燃燒不進的激情,追隨她~ 不要讓自己迷失方向,安於現狀,不要冷漠了任何事物,她總會有她神奇的一面,不斷的挖掘,相信你都會有人家體會不到的收穫,好奇心,永遠保持一顆好奇心!以上是算給自己新年鼓鼓氣,接下來還是要落地,寫寫今天的收穫!

問題說明:

年前做的web和pc的一個專案,背景當時是用的一個plane然後上面放的是一個帶有背景圖片的一個材質球,這個通過改變plane的z軸屬性是能控制它的顯示在3D模型之後,但貌似自適應有點難以控制,當時是用過在介面上手動改變的Scale屬性來讓背景鋪滿整個視窗,但無法自適應所有解析度大小的視窗,然後我就想通過動態程式碼在plane上新增一個Textrue2D的一個圖片,但發現無論怎樣拖動模型的z軸屬性還是不能讓模型顯示在背景之前。後來經過一段摸索,搞定,這將摸索過程寫下來。

在這裡我要提一下MeshRenderer,即網格渲染器,如果我們不勾選這個網格渲染器,在Game場景中是看不到plane的樣子的,即網格渲染器將材質渲染出來,材質中包含Texture屬性,我們可以選擇自己的貼圖,也可以選擇顏色,網格渲染器就可以將材質中的這些給渲染出來,讓我們看到,原來我就是通過這個方法來實現的背景圖,下面是另一種新增GUITexture的方法來實現,利用到了多個攝像機共同合作達到效果!

解決步驟:

1.新增一個攝像機,命名為BackgroundCamera,然後在Layer新增一個background層。並且將plane拖放到改相機節點下。然後將BackgroundCamera和Plane都置於background層,修改ClearFlags未Depthonly深度渲染,並且設定CullingMask為只看到background層,還有設定Depth為-1,說明背景層是最深,其他model所在的相機的Depth是0,NGUI的是1,這裡層次關係就是NGUI在最前面,model層其次,然後是背景層,這樣確保3D模型在背景的前面!
2.同樣的操作,將MainCamera設定一下,注意的就是,將MainCamera的CullingMask不能包含background層,也就是讓它看不到背景層,不然還是會出現背景遮擋住模型的情況。

3.在plane上新增一個指令碼,用於動態在plane上載入貼圖
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class AddBackground : MonoBehaviour
{
    public Texture2D mtexture;

    void Awake()
    {
//        Texture2D mtxture = new Texture2D(Screen.width, Screen.height);
//        renderer.material.mainTexture = mtxture;
//        mtxture.Apply();
        
        gameObject.AddComponent<GUITexture>();
    }

    // Use this for initialization
    void Start()
    {
        guiTexture.texture = mtexture;
        transform.localScale = new Vector3(0, 0, 0);
        transform.localPosition = new Vector3(0, 0, 25);
        guiTexture.pixelInset = new Rect(65, 0, Screen.width, Screen.height);
    }
}
上面Start方法中設定position的z軸屬性是原來嘗試的,想通過z軸來進行深度的修改後來發現行不通,還是層的關係影響渲染的深度。
4.效果圖

==================== 迂者 丁小未 CSDN部落格專欄=================

Unity QQ群:375151422         cocos2dx QQ群:280818155

====================== 相互學習,共同進步 ===================