ILayoutSelfController 是应驱动其自己的 RectTransform 的 ILayoutController。
iLayoutSelfController 派生自基控制器 ILayoutController,控制 RectTransform 的布局。
使用 ILayoutSelfController 可操作 GameObject 自己的 RectTransform 组件(在 Inspector 中附加)。使用 ILayoutGroup 可操作属于 GameObject 的子项的 RectTransform。
调用 ILayoutController.SetLayoutHorizontal 可处理布局的水平部分,调用 ILayoutController.SetLayoutVertical 可处理垂直部分。
可以更改 RectTransform 的高度、宽度、位置和旋转。
//This script shows how the GameObject’s own RectTransforms can be changed. //This creates a rectangle on the screen of the scale, positition and rotation you define in the Inspector. //Make sure to set the X and Y scale to be more than 0 to see it
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;
public class Example : UIBehaviour, ILayoutSelfController { //Fields in the inspector used to manipulate the RectTransform public Vector3 m_Position; public Vector3 m_Rotation; public Vector2 m_Scale;
//This handles horizontal aspects of the layout (derived from ILayoutController) public virtual void SetLayoutHorizontal() { //Move and Rotate the RectTransform appropriately UpdateRectTransform(); }
//This handles vertical aspects of the layout public virtual void SetLayoutVertical() { //Move and Rotate the RectTransform appropriately UpdateRectTransform(); }
//This tells when there is a change in the inspector #if UNITY_EDITOR protected override void OnValidate() { Debug.Log("Validate"); //Update the RectTransform position, rotation and scale UpdateRectTransform(); }
#endif
//This tells when there has been a change to the RectTransform's settings in the inspector protected override void OnRectTransformDimensionsChange() { //Update the RectTransform position, rotation and scale UpdateRectTransform(); }
void UpdateRectTransform() { //Fetch the RectTransform from the GameObject RectTransform rectTransform = GetComponent<RectTransform>();
//Change the scale of the RectTransform using the fields in the inspector rectTransform.localScale = new Vector3(m_Scale.x, m_Scale.y, 0);
//Change the position and rotation of the RectTransform rectTransform.SetPositionAndRotation(m_Position, Quaternion.Euler(m_Rotation)); } }