2012-04-19 39 views
4

這是我的第一個問題。無法找到關於該主題的任何內容。無法更改附加到遊戲對象的腳本的公共變量。在遊戲中恢復數值

我想創建一個編輯器腳本,用於更改連接到GameObject的腳本中的許多公共布爾值。

我把這個腳本附加到一個GameObject上。遊戲對象是一個預製:

using UnityEngine; 
using System.Collections; 

public class ScriptWithPublicBools : MonoBehaviour { 

    public bool b1; 
    public bool b2; 
} 

這裏是我的編輯腳本:

using UnityEngine; 
using System.Collections; 
using UnityEditor; 

public class EditorHelper : ScriptableObject 
{ 
    [MenuItem("Trace/Trace")] 
    public static void trace() 
    { 
     foreach (GameObject g in Selection.gameObjects) 
     { 
      ScriptWithPublicBools tb = g.GetComponent<ScriptWithPublicBools>(); 

      if (tb) 
      { 
       tb.b1 = false; 
       tb.b2 = true; 
      } 
     } 
    } 
} 

腳本工作正常,並在遊戲對象的布爾變量在編輯器中正確設置。但是當我按下PLAY按鈕時,兩個bool的值會切換回腳本應用之前的值。

無論預製件的值是什麼,在應用編輯器腳本之前,這些值都會恢復到值。

我做錯了什麼或它是一個錯誤?

如果我應用編輯器腳本,將場景保存爲新場景,並打開新創建的場景,這些值也是錯誤的。

但是,如果GameObject不是預製件,那麼所有的工作都完美無缺,並且即使在啓動播放模式之後,值仍然保持其由編輯器腳本給出的值。

所以這個問題只存在於使用預製件時。

+0

順便說一句,我對團結3.5.0 – ymerkryds 2012-04-19 11:09:17

+0

+1令人感興趣,歡迎SO。 _(GameObject是預製件)_:場景中的GameObject來自我理解預製件的實例,但不是預製件本身。我是否理解你是正確的,在這種情況下,變化是可見的,但不適用於預製本身? – Kay 2012-04-19 19:46:46

+0

是的,你已經正確地理解了我。你的觀點是正確的,我的場景中的GameObject是一個預製的實例。由編輯器腳本設置的值僅適用於場景中的GameObject,並且不會應用於預製。但是當我按PLAY按鈕或保存場景並重新打開時,值不會被保存,而是在應用編輯器腳本之前將其恢復爲值。如果我打破預製實例,這不會發生。 – ymerkryds 2012-04-20 09:14:06

回答

4

完成所有更改後,您需要致電EditorUtility.SetDirty (tb);,有關詳細信息,請參閱EditorUtility.SetDirty

如果您需要更改預製本身,看看PrefabUtility

+0

非常感謝。這解決了這個問題 - 當然:) – ymerkryds 2012-04-23 12:44:15