2016-05-12 6 views
2

私はスライダをその右側で伸ばそうとしています。スライダーとその「塗りつぶし領域」にスクリプトを添付しました。Sliderの幅を右のC#Unityだけで変更してください。

public Slider healthSlider; 
public GameObject healthRect; 

void Update() { 
    healthRect.GetComponent<RectTransform>().sizeDelta += Vector2.right * Time.deltaTime; 
} 

アンカーは事前みんなで「記入エリア」 感謝のためのスライダー放置トップとトップストレッチに設定されている...私はsizeDeltaを変えてみましたが、それは両方の方法に広がっています。

答えて

1

RectTransformSetInsetAndSizeFromParentEdgeメソッドを試してみてください。あなたのコードは次のようになります:

public Slider healthSlider; 
public GameObject healthRect; 
private float sliderSize = 100; 

void Update() 
{ 
    healthRect.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, sliderSize); 
    sliderSize += Time.deltaTime; 
} 

これは、右側に「拡大」しながらスライダーを左に並べたままにします。 2番目のパラメータでは、スライダの左側が親に対して相対的な位置に配置されます。

注:更新機能でGetComponentを呼び出すと、あなたはStartRectTransformへの参照をキャッシュして、そのようにそれを使用する必要があり、非効率的である:

それをやって
public Slider healthSlider; 
public GameObject healthRect; 
private float sliderSize = 100; 
private RectTransform healthRectTransform; 

void Start() 
{ 
    healthRectTransform = healthRect.GetComponent<RectTransform>(); 
} 

void Update() 
{ 
    healthRectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, sliderSize); 
    sliderSize += Time.deltaTime; 
} 

この方法は、あなただけGetComponentを呼び出す必要があることを意味より効率的なStart関数で1回実行されます。

メモメモ:あなただけのインスペクタでhealthRectゲームオブジェクトを割り当て、唯一それがRectTransformコンポーネントです得るためにそれを使用している場合、あなたはこの変数を削除することができ、ちょうどインスペクタでhealthRectTransformフィールドを割り当て、Startで一部をスキップ方法。

+0

ありがとうございました!それにもかかわらず、なぜGetComponentをキャッシュしなければならないのか分かりません。 – Ay0m3

+0

そうしないと、すべてのフレームで 'GetComponent'が呼び出されます。これは、すべてのフレーム*で必要なコンポーネントのgameObject全体を検索していることを意味します。参照をキャッシュするとコンポーネントが一度取得され、代わりにローカルメンバー変数が使用され、毎回それを探す必要がありません。あなたはより多くの情報が必要な場合は、あなたはそれをGoogleすることができます。そこには数百万のブログ/フォーラムスレッドがあります。 :) –

関連する問題