如何在 Creator3D 中切換模型貼圖,超級簡單!


效果預覽

file

前兩天有伙伴在 QQ 上詢問,如何在 Creator 3D 中切換模型貼圖。Shawn 之前也沒嘗試過,不過根據之前 Cocos Creator 的經驗以及這幾天對 Creator 3D 的學習,簡單嘗試了一下,方法可行,在此將它分享給大家。

模型材質資源

在 Creator 3D 中,一個 3D 物體主要由 ModelComponent 組件進行渲染,其中包含兩大部分:

  1. Mesh:物體的形狀,它是一組3維坐標上的點集
  2. Material:物體的表現,材質資源以及材質所使用的紋理貼圖

在 Creator3D 編輯中,我們可通過圖形化拖動的方式修改材質貼圖,如下圖:
file

上圖中,先使用引擎內置的無光照的 Effect,它的選項看起來沒那么多,可以減少畏懼感,我們將一 ground 的圖片拖動到 test.mtl 材質資源上。

然后將 test 材質拖動到 Cube 物體的 ModelComponent 組件上:

file

設置好后你就可以看到 Cube 上的像石頭一樣的材質表現了。

使用腳本修改材質紋理

我這里創建了一個 test.ts 的腳本文件,用於修改材質上的紋理資源,先看下組件屬性:
file

注意 3D 物體上的貼圖不是Cocos Creator中的 SpriteFrame,而是 Texture2D 類型,下面是 Texture1、Texture2屬性定義:

@ccclass("test")
export class test extends Component {
    
    @property({type: Texture2D })
    texture1: Texture2D = null;

    @property(Texture2D)
    texture2: Texture2D = null;

}

復雜數據類型需要給 @property 輸入一個 type 參數,同時下面一行,需要給變量設置為null,不然在屬性面板上不顯示。

紋理資源已經設置好了,如何通過代碼訪問或修改材質呢?經過Shawn的一陣摸索,發現還是非常簡單的,使用材質對像的getProperty、setProperty就可以搞定:

swithcTextue() {
    //獲取ModelComponent組件
    let modelComponent = this.getComponent(ModelComponent);
    //獲取0號材質
    let material = modelComponent.materials[0];
    //獲取紋理 
    let texture = material.getProperty('mainTexture');
    //設置紋理
    material.setProperty('mainTexture', texture === this.texture1 ? this.texture2 : this.texture1);
}

material.setProperty的參數是Key和Value,分別對應材質面板上的Key與紋理對象,看下圖:

file

用material.setProperty也是同理,如果你是使用的標准Effect,也是用同樣的方法:

file

只需要將材質屬性中的屬性名,首字母小寫就可以了!

小結

本篇介紹了使用 material.setProperty 修改材質紋理。最后我們思考一個問題,如果有兩個 3D 物理,使用了同一個材質資源,在編輯器中修改材質貼圖你會發現兩個物理都會同時發生變化,看下圖:
file

如果我們是用代碼,在運行時修改了任意一個 3D 物體上的材質屬性,另一個 3D 物體的材質會變嗎?Shawn做了一下測試,但並沒有變,看下面的效果:
file

之前 Shawn 在想,如果運行時也會變的話,比如生成一桌子的麻將牌,豈不是要為每一紋理創建一個材質資源,現在好像擔心多了!

最后感謝你的閱讀,原創不易,求個贊!願我們在前進的道路上砥礪前行,共同成長!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM