こんにちは、Unity 4.6ベータ版の新しいUIシステムを使用しています...
さまざまなコードを試し、ドキュメントを見て、検索しましたが、答えが見つかりません…
例えば。画像があり、実行時に幅と高さを変更したい。
public GameObject image4;
image4.GetComponent<RectTransform>().rect.Set(0,0,100, 300);
動作しません。また、image4.GetComponent()。rect.yはGETのみであるため、実行時に変更できません。
私も試しました:
image4.transform.localScale.y = 15;
どちらも機能しません。
実行時にサイズを変更する適切な方法は何ですか? JSまたはC#のいずれかの例を提供できますが、問題ではありません。
ある日研究しています。新しいUIシステムに対処するのに役立つ拡張機能を見つけました。必要に応じて、この拡張機能を改善できます。
public static class RectTransformExtensions
{
public static void SetDefaultScale(this RectTransform trans) {
trans.localScale = new Vector3(1, 1, 1);
}
public static void SetPivotAndAnchors(this RectTransform trans, Vector2 aVec) {
trans.pivot = aVec;
trans.anchorMin = aVec;
trans.anchorMax = aVec;
}
public static Vector2 GetSize(this RectTransform trans) {
return trans.rect.size;
}
public static float GetWidth(this RectTransform trans) {
return trans.rect.width;
}
public static float GetHeight(this RectTransform trans) {
return trans.rect.height;
}
public static void SetPositionOfPivot(this RectTransform trans, Vector2 newPos) {
trans.localPosition = new Vector3(newPos.x, newPos.y, trans.localPosition.z);
}
public static void SetLeftBottomPosition(this RectTransform trans, Vector2 newPos) {
trans.localPosition = new Vector3(newPos.x + (trans.pivot.x * trans.rect.width), newPos.y + (trans.pivot.y * trans.rect.height), trans.localPosition.z);
}
public static void SetLeftTopPosition(this RectTransform trans, Vector2 newPos) {
trans.localPosition = new Vector3(newPos.x + (trans.pivot.x * trans.rect.width), newPos.y - ((1f - trans.pivot.y) * trans.rect.height), trans.localPosition.z);
}
public static void SetRightBottomPosition(this RectTransform trans, Vector2 newPos) {
trans.localPosition = new Vector3(newPos.x - ((1f - trans.pivot.x) * trans.rect.width), newPos.y + (trans.pivot.y * trans.rect.height), trans.localPosition.z);
}
public static void SetRightTopPosition(this RectTransform trans, Vector2 newPos) {
trans.localPosition = new Vector3(newPos.x - ((1f - trans.pivot.x) * trans.rect.width), newPos.y - ((1f - trans.pivot.y) * trans.rect.height), trans.localPosition.z);
}
public static void SetSize(this RectTransform trans, Vector2 newSize) {
Vector2 oldSize = trans.rect.size;
Vector2 deltaSize = newSize - oldSize;
trans.offsetMin = trans.offsetMin - new Vector2(deltaSize.x * trans.pivot.x, deltaSize.y * trans.pivot.y);
trans.offsetMax = trans.offsetMax + new Vector2(deltaSize.x * (1f - trans.pivot.x), deltaSize.y * (1f - trans.pivot.y));
}
public static void SetWidth(this RectTransform trans, float newSize) {
SetSize(trans, new Vector2(newSize, trans.rect.size.y));
}
public static void SetHeight(this RectTransform trans, float newSize) {
SetSize(trans, new Vector2(trans.rect.size.x, newSize));
}
}
ここから見つけたソースコード: http://orbcreation.com
ちょっと友達はこれを試してUI gameObjectの位置と幅を変更します
オブジェクトのインスタンスを使用する場合は、This leftButton.GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f); rightButton.GetComponent<RectTransform>().sizeDelta = new Vector2(x, y);
を使用します
そして、UIオブジェクトにスクリプトを配置したい場合は、これを試して高さと幅を変更してください
GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f);
GetComponent<RectTransform>().sizeDelta = new Vector2(x, y)
親を変更するとき(たとえば、Instantiateの後)、面倒なことに、いくつかのパラメーターをリセットすると本当に助けになることがわかりました(これを理解しようとしてかなりの時間を費やしました):
this.transform.SetParent(content.transform);
this.transform.localScale = Vector3.one;
this.rectTransform.sizeDelta = Vector2.zero;
this.rectTransform.anchoredPosition = Vector2.zero;
それが他の誰かを助けることを願っています:)
実際に次のことで遊んで助けることができます:GetComponent.sizeDelta = new Vector(new_size.x、new_size.y);
このプロパティを設定することで、新しいGUIでズームを正常に達成しました。
スケーリング用の独自のコードは次のとおりです。
void Start()
{
// Store initial Size and Position;
ZoomedOutSize = new Vector2(GetComponent<RectTransform>().rect.width, GetComponent<RectTransform>().rect.height);
ZoomedOutPos = new Vector2(GetComponent<RectTransform>().localPosition.x, GetComponent<RectTransform>().localPosition.y);
}
void Update()
{
// Calculate the total delta at runtime cause it depends on parent (yah i know it's not optimal to have new vector ecery Update)
ZoomSizeRate = new Vector2(gameObject.GetComponentInParent<ZoomDialog>().MaxSize.x - ZoomedOutSize.x, gameObject.GetComponentInParent<ZoomDialog>().MaxSize.y - ZoomedOutSize.y);
ZoomPosRate = -GetComponent<RectTransform>().localPosition;
// Zoom is the float with range(0,1) 0 - no Zoom, 1 - Fully Zoom to ParentSize;
//Set the size delta and position as Initial + Rate * Zoom
GetComponent<RectTransform>().sizeDelta = new Vector2(ZoomedOutSize.x + ZoomSizeRate.x * Zoom, ZoomedOutSize.y + ZoomSizeRate.y * Zoom);
GetComponent<RectTransform>().localPosition = new Vector2(ZoomedOutPos.x + ZoomPosRate.x * Zoom, ZoomedOutPos.y + ZoomPosRate.y * Zoom);
}
[C#]のようなものを使用してみてください:
...
RectTransform rTrans = (RectTransform) transform.GetComponent<RectTransform>();
// set new width and height
rTrans.anchoredPosition = new Vector2(15, 200);
...
通常、これらの値を直接変更したくないのは、キャンバス(またはその他)の下に正しく追加するだけで、「位置を変更する」場合は、既に正しい座標でセットアップ済みのプレハブからのものである場合この:
GameObject instance;
void Start () {
GameObject canvas = GameObject.Find ("Canvas");
if (canvas != null) {
GameObject go = Resources.Load<GameObject>("MyPrefab");
if(go != null){
instance = Instantiate(go);
instance.GetComponent<Transform>().SetParent(canvas.GetComponent<Transform>(), false);
}
}
}
親セットにfalse
を渡すと、プレハブをインスタンス化するときに、変な形で変更されるrect変換が回避されます。