2015-08-15 158 views
2

但是,如果有類似的問題,我很抱歉,我可能已經看到它,但它並沒有解決我的問題。腳本GUI按鈕觸發更改材質的事件

我想寫一個JS腳本爲了實現一個點擊觸發的事件。

我在網上搜索了UnityAnswers網站和其他人,我可以得到最接近的是基於這些問題 http://answers.unity3d.com/questions/368303/changing-shaders-of-a-gameobject-via-script-1.html

而這一次 http://answers.unity3d.com/questions/319875/change-objects-material-using-gui-buttons-via-scri.html

,也看了這一個 http://docs.unity3d.com/ScriptReference/Material-shader.html

所以,我的代碼是這個到目前爲止

var button2_tex : Texture; 
var button3_tex : Texture; 
var button4_tex : Texture; 
var seat_mat1 : Material; 
var seat_mat2 : Material; 
var veneer1 : Texture; 
var veneer2 : Texture; 
var rend : Renderer; 
var _mouseDown = false; 



function Start() { 

    seat_mat1 = Resources.Load("seat_mat1"); 
    seat_mat2 = Resources.Load("seat_mat2"); 

} 

function Update(){ 

     if(Input.GetMouseButtonDown(0)){ 

      _mouseDown = true; 

     } 

} 

function OnGUI() { 

GUI.Box (Rect (10,10,100,200), "Menu"); 

     if (_mouseDown){ 

      if (GUI.Button (Rect (20,40,40,20), button1_tex)){ 

      if(seat_mat1){ 


       rend.material = seat_mat2; 
       Debug.Log("This button was clicked!"); 
       } 

      else{ 

       rend.material = seat_mat1; 
       } 

      } 

     } 

請注意我尚未使用的一些變量,因爲我仍在測試一堆其他代碼,以使其工作..

我試圖修復的代碼片段以「function OnGUI()」開頭,但是我也許是錯的,可以使用一些新的見解。

這是生成的腳本的屏幕截圖。假設左側的按鈕通過鼠標點擊按鈕將材料的顏色從seat_mat1更改爲seat_mat2。

enter image description here

我重視前面的腳本,以團結3D對象,並做了一個文件夾名稱「資源」的物質是可見的,並通過腳本引用。

我的問題是,單擊GUI按鈕時,什麼也沒有發生,它可能是一個非常簡單的東西,我只是想念它..道歉沒有經驗的JS很多或團結。

在此先感謝。

編輯:

所以打多一點的代碼之後。我此行

GetComponent.<Renderer>().material = seat_mat2; 
Debug.Log("This button was clicked!"); 

後加入的debug.log(),似乎是這個錯誤,我越來越每次按下按鈕

時間「MissingComponentException:沒有‘渲染’連着到「scene_export3」遊戲對象,但腳本正在嘗試訪問它 您可能需要將渲染器添加到遊戲對象「scene_export3」中,或者您的腳本需要在使用之前檢查組件是否已連接 materialChanger .OnGUI()(在Assets/materialChanger.js:44)「

因此,通過簡單的瞭解,似乎渲染器不是以某種方式連接的?

回答

0

你的代碼工作正常但我仍然認爲一旦你已經加載了啓動函數中的材料,你不需要每次加載它們。還有一件事是確保你已經將腳本應用到了你想改變材質的遊戲對象。如果你只是想改變顏色不想改變材料的顏色屬性,你的OnGUI函數應該看起來像這樣。

function OnGUI() { 

GUI.Box (Rect (10,10,100,200), "Menu"); 

    if (_mouseDown){ 

     if (GUI.Button (Rect (20,40,40,20), button1_tex)){ 

      if(GetComponent.<Renderer>().material == seat_mat1) 


       GetComponent.<Renderer>().material.color = seat_mat2.color; 


      else 

       GetComponent.<Renderer>().material.color = seat_mat1.color; 

      } 

     } 

    } 

但是,如果你不使用色彩poperty它將很好地工作只是確保你已經應用腳本遊戲boject要更改材料我你的情況可能是您的seat1。

+0

謝謝您的回答,我明白,我不需要每次都加載它們,但我仍然嘗試,實現了工作代碼。我知道我的理論上可以工作,但是,有些事我無法控制,那就是沒有操作它。我將腳本作爲一個整體附加到gameObject中,因爲我正在尋找使用相同材質更改所有對象的材質,例如seat_mat1到seat_mat2。現在我明白了渲染器本身並沒有按照上面的編輯開始,現在我正在關注這一點,我希望很快能夠找到答案。 –

+0

是的,這正是問題所在,因爲您已將腳本附加到錯誤的遊戲對象上,而應將此腳本附加到應用了材質的遊戲對象。 – Nain

+0

,或者您可以將seat_mat1材質應用於具有此腳本的gameobject,即使這樣它也可以工作。因爲異常顯示遊戲對象沒有渲染,但你使用的是GetComponent。 ().material會得到gameobject的渲染器,如果沒有附加,它會通過例外 – Nain

0

感謝納恩的指導,在您的幫助下,我能夠想出一個部分解決方案,我知道我可以從那裏解決。 解決方案如下。

代碼:在您創建一個空的遊戲對象,並使用特定的材料,例如添加的所有對象

function OnGUI() { 

GUI.Box (Rect (10,10,100,200), "Menu"); 

     if (_mouseDown){ 

      if (GUI.Button (Rect (20,40,40,20), button1_tex)){ 


       var rendArray : Renderer[]; 

       rendArray = GetComponentsInChildren.<Renderer>(true); 

       for(var rend : Renderer in rendArray){ 

       if(rend.sharedMaterial == seat_mat1){ 

        rend.sharedMaterial = seat_mat2; 
        Debug.Log("This button was clicked!"); 
        } 

       else{ 

        rend.sharedMaterial = seat_mat1; 
        } 

        } 

       } 

      } 

     } 

節省MonoDevelop中,開放統一的腳本後seat_mat1作爲兒童。 然後單擊空對象,如果您喜歡,請將其重命名,然後從「添加組件>網格>網格渲染器」中添加「網格渲染器」組件。 之後,拖動腳本到空對象,並在督察中,你可以找到一個選項,你可以選擇一個叫做「rend」的渲染器。選擇空對象作爲網格渲染器。

在測試結果後,我設法將一些對象的材質一起更改爲seat_mat2,但無關材料已將其自身更改爲seat_mat1,並且一旦再次單擊該按鈕,它們會在seat_mat1和seat_mat2之間交替,即使它不是完美的完成,我正在回答這個問題,因爲任何事情都是可以解決的(我希望)。

再次感謝您奈恩的幫助:)