要实现的效果就是,当点击长button时,长button相对应的下面两个段button会收进长button里,并且,下面的其他组件(这里是button)会相应的往上移动。
左图为层级结构,右图为运行效果。
注:我在Panel(3)上加了一个Vertical Layout Group组件用来布局,使里面三个panel纵向排列。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Buttontask : MonoBehaviour {
public Button[] buttons;//每个panel下按钮的集合
public GameObject panel;//父物体panel
private List<Vector3> childbuttonlocal = new List<Vector3>();//记录长button下子button的localposition
private bool open=true;//是否是展开状态
// private Vector3 openlocationposition;
Vector2 sizedelta;//父对象panel的width和height
// Use this for initialization
void Start () {
for (int i=0;i< buttons.Length;i++)//展开状态下每个子按钮的相对位置
{
childbuttonlocal.Add(buttons[i].transform.localPosition);
// Debug.Log(childbuttonlocal[i]);
}
sizedelta = panel.transform.GetComponent<RectTransform>().sizeDelta;//展开状态下panel的宽高
}
// Update is called once per frame
void Update () {
}
public void OnClick()
{
if (open)
{
//设置panel大小
panel.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(panel.transform.GetComponent<RectTransform>().sizeDelta.x, 50f);
for (int i=0; i<buttons.Length;i++)
{
// buttons[i].transform.localPosition = Vector3.Lerp(childbuttonlocal[i], new Vector3(childbuttonlocal[i].x,0,0), 1);
buttons[i].transform.localPosition=new Vector(childbuttonlocal[i].x,0,0); //设置位置
buttons[i].gameObject.SetActive(false);
}
open = false;
}
else
{
panel.transform.GetComponent<RectTransform>().sizeDelta = sizedelta;
for (int i = 0; i < buttons.Length; i++)
{
buttons[i].gameObject.SetActive(true);
buttons[i].transform.localPosition = Vector3.Lerp(new Vector3(childbuttonlocal[i].x, 0, 0), childbuttonlocal[i], 1);
}
open = true;
}
}
}
当然可以用动画做,这样感觉更简单点,还能有动画效果,怪我懒,不想再去折腾动画了...
浙公网安备 33010602011771号