2015-10-14 28 views
2

我正在研究Unity中的一個項目,該項目涉及將任何非靜態對象從一個傳送到配對的區域。這部分很好,但爲了方便,我試圖編寫腳本的一部分,它將調整一個對象的大小,如果它的對被調整大小,這樣它們將總是具有相同的大小。到目前爲止它的工作 - 大多數。我遇到的唯一問題是當試圖通過Transform組件調整大小時 - 例如,在Inspector中鍵入數字,或者在X或Y或Z上使用值滑塊。這些手柄工作正常。我想,這並不是什麼大不了的事,但如果我能弄清楚爲什麼這樣做不行,所以我可以學會將來做什麼,我會很高興。下面的代碼:Unity - 調整一個GameObject的大小以匹配另一個

[ExecuteInEditMode] 
public class TransferRegion : MonoBehaviour { 
    // Unrelated code... 

    public bool scaleManuallyAltered { 
     get; private set; 
    } 

    [SerializeField] 
    private TransferRegion pair; 

    private Vector3 scale; 

    // Called whenever the scene is edited 
    void Update() { 
     if (scale != gameObject.transform.localScale) { 
      scaleManuallyAltered = true; 
      scale = gameObject.transform.localScale; 
     } 
     if (pair && scaleManuallyAltered && !pair.scaleManuallyAltered) { 
      pair.transform.localScale = scale; 
     } 
    } 

    // Called AFTER every Update call 
    void LateUpdate() { 
     scaleManuallyAltered = false; 
    } 

    // Unrelated code... 
} 

如果任何人都可以看到一些重大的邏輯錯誤我做的,我想知道。如果我的代碼有點難以理解,我也可以解釋一下我的邏輯流程,我知道我很容易產生一些令人困惑的結構。
謝謝大家。

+0

你的代碼是做什麼的?它不是做什麼的?如果不通過「變換」,你如何縮放? – 31eee384

+0

代碼查看應用對象是否已調整大小,如果有,則調整配對對象的大小。更確切地說,如果GameObject的當前比例與先前記錄的比例不同,在這種情況下,它將'scaleManuallyAltered'標誌設置爲true,然後重置scale變量,然後檢查其他GameObject是否已經調整大小;如果沒有,則會將該對中的比例更改爲當前比例。 – BHustus

+0

哦,對。我正在看*的代碼幾乎可以工作。關鍵的失敗:它似乎並不喜歡在一個對象或另一個對象上的Transform組件中接受手動,編號類型的縮放編輯。我不確定你的意思是「不通過變換」 - 因爲我認爲我*是*。 – BHustus

回答

1

如果您希望一個對象與另一個對象的比例相同,那麼爲什麼不通過設置調整大小的遊戲對象的比例來直接簡化您的代碼,而直接基於它所基於的遊戲對象的比例?例如,此腳本重新大小的物體其對規模相匹配,而在編輯模式:

using UnityEngine; 
using UnityEditor; 
using System.Collections; 

[ExecuteInEditMode] 
public class tester : MonoBehaviour 
{ 
    public Transform PairedTransform; 

    void Update() 
    { 
     if (!Selection.Contains(gameObject)) 
     { 
      gameObject.transform.localScale = PairedTransform.localScale; 
     } 
    } 
} 

我測試了這個在我的場景兩個立方體。我可以使用小工具來調整大小,也可以手動在檢查器中的變換編輯字段中輸入數字。

編輯:通過利用Selection,可以將比例更改僅應用於層次結構中未選中對中的對象。這種方式不會互相競爭來擴大自己的規模。

+0

哦,太近了! *幾乎*可用。問題是,它的工作原理*只有一種方法*。對象A被調整得很好,對象B與它匹配,當然,但問題是,如果你嘗試調整B的大小,它會不斷地引用腳本並將其自身重置爲A的比例 - 這正是我爲什麼不採取簡單的路線和首先有錯綜複雜的系統。 – BHustus

+0

我沒有考慮從兩個對象縮放。我編輯了我的答案來解決這個問題! –

+0

我以前從未使用過Selection!我從來沒有想過它存在!非常感謝!! – BHustus

0

所以我想通了。
我不知道什麼錯了我的原代碼,但最終我還是決定滑入好的老得心應手事件的境界:

[ExecuteInEditMode] 
public class TransferRegion : MonoBehaviour { 
    //... 
    [SerializeField] 
    private UnityEvent rescaled; 
    //... 
    void Update() { 
     if (scale != gameObject.transform.localScale) { 
      scale = gameObject.transform.localScale; 
      rescaled.Invoke(); 
     } 
    } 
    //... 
    public void OnPairRescaled() { 
     gameObject.transform.localScale = pair.transform.localScale; 
     scale = gameObject.transform.localScale; 
    } 
} 

而且只設置OnPairRescaled事件成爲聽衆配對對象的rescaled事件。

Ta-da!

相關問題