终于决定把自己的代码放出来了,从构思到写代码用了2天,吃饭,洗衣,出去搞东西都在想思路
不但是这个界面,后面有个更复杂的界面——那个代码就不放出来了,该代码比较臃肿,在复杂版本中已经简化,这个也没时间简化了
一些不相干的东西删除了,AssistClass.RectToVec4和AssistClass.Vec4ToRect是我自己写的辅助函数,这个你也可以,看名称就知道它的作用了
更复杂的界面,也是在此思路上,不过思维跳跃更诡异,牵涉到工作问题就不贴了
BTW,我的很多代码思路是非工作时间想出来,比如说睡觉,洗澡的时候
思路,不是代码,代码还是上班时间写,写代码的很幸福,也很孤独
废话不说,注释不是很完善,因为自己写代码的时候老有紧迫感,很不好,往往漏掉了自己记忆深刻的地方加上注释
//code by Cynixway,2011.12.04
using UnityEngine;
using System.Collections;
public class GUI2_1 : MonoBehaviour {
public Texture2D[] tex1=new Texture2D[3] ;//图片组1
public Texture2D[] tex2=new Texture2D[3] ;//图片组2
public Rect[] winRects;//窗口位置
Rect[] tempRect;//移动中的临时位置
public int texWidth;//图片宽度
public int texHeight;//图片高度
public int tab;//图片滚动间隙
public float rockSpeed = 10f;//图片滚动速度
//临时滚动GUI Button位置
Rect[] rockRect = new Rect[3];
public GUISkin guiSkin;
bool rockPic1,rockPic2;
struct PosNStas
{
public int pos;//从左到右,0~2
public int status;//移动状态,0,stop;1,右移;-1,左移;
public Rect posRect;//窗口位置
public Rect[] texRect;//内部Texture位置
public Texture2D[] tex;
};
PosNStas[] pns=new PosNStas[2];//表示两个window的状态
void Awake()
{
}
void Start ()
{
pns[0].pos = 0;
pns[0].posRect=winRects[0];
pns[0].status = 0;
pns[0].texRect=new Rect[3];
pns[0].tex = tex1;
pns[1].pos = 2;
pns[1].posRect=winRects[2];
pns[1].status = 0;
pns[1].texRect=new Rect[3];
pns[1].tex = tex2;
for (int i = 0; i < 3;i++ )
{
pns[0].texRect[i]=pns[1].texRect[i]=rockRect[i] = new Rect((texWidth+tab)*(i-1),0,texWidth,texHeight);
}
}
// Update is called once per frame
void Update ()
{
MoveWindow();
//图片滚动
for (int i = 0; i < 2;i++ )
{
if (pns[i].pos == 1 && pns[i].status == 0)//中间位置并不移动
{
for (int j = 0; j < 3;j++ )//移动texRect位置
{
// print(pns[i].texRect[j]);
pns[i].texRect[j] = new Rect(pns[i].texRect[j].left+ rockSpeed, pns[i].texRect[j].top, pns[i].texRect[j].width, pns[i].texRect[j].height);
if (pns[i].texRect[j].left > 2*(texWidth+tab))
{
pns[i].texRect[j] =new Rect( -(texWidth + tab),pns[i].texRect[j].top, pns[i].texRect[j].width, pns[i].texRect[j].height);
}
}
}
}
}
void OnGUI()
{
GUI.skin = guiSkin;
GUI.depth = 1;
GUI.Window(0, pns[0].posRect, Winfuc, "");
GUI.Window(1, pns[1].posRect, Winfuc, "");
}
void Winfuc(int id)
{
if (pns[id].pos!=1||pns[id].status!=0)//不在中间,或者在移动中
{
if (GUI.Button(new Rect(0, 0, texWidth, texHeight), pns[id].tex[1]))
{
for (int i = 0; i < 3; i++)
{
pns[0].texRect[i] = pns[1].texRect[i] = rockRect[i];
}
switch(id)//那个窗口被点击了
{
case 0://全体右转
pns[0].status = 1;
pns[1].status = 1;
break;
case 1://全体左转
pns[0].status = -1;
pns[1].status = -1;
break;
default:
break;
}
}
}
else
{
for (int i = 0; i < 3; i++)
{
if (GUI.Button(pns[id].texRect[i], pns[id].tex[i]))
{
//do something
}
}
}
}
void MoveWindow()
{
if (pns[0].status == 0 && pns[1].status==0)//不需要移动位置
return;
if(pns[0].status==1)//窗口0右移
{
if (Vector2.Distance(AssistClass.RectToVec4(pns[0].posRect), AssistClass.RectToVec4(winRects[1]))>0.1f)
{
pns[0].posRect = AssistClass.Vec4ToRect(Vector4.Lerp(AssistClass.RectToVec4(pns[0].posRect), AssistClass.RectToVec4(winRects[1]),0.1f));
}
else
{
pns[0].status = 0;
pns[0].pos = 1;
}
}
if (pns[1].status == 1)//窗口1右移
{
if (Vector4.Distance(AssistClass.RectToVec4(pns[1].posRect), AssistClass.RectToVec4(winRects[2])) > 0.1f)
{
pns[1].posRect = AssistClass.Vec4ToRect(Vector4.Lerp(AssistClass.RectToVec4(pns[1].posRect), AssistClass.RectToVec4(winRects[2]), 0.1f));
}
else
{
pns[1].status = 0;
pns[1].pos = 2;
}
}
if (pns[0].status == -1)//窗口0左移
{
if (Vector4.Distance(AssistClass.RectToVec4(pns[0].posRect), AssistClass.RectToVec4(winRects[0])) > 0.1f)
{
pns[0].posRect = AssistClass.Vec4ToRect(Vector4.Lerp(AssistClass.RectToVec4(pns[0].posRect), AssistClass.RectToVec4(winRects[0]), 0.1f));
}
else
{
pns[0].status = 0;
pns[0].pos = 0;
}
}
if (pns[1].status == -1)//窗口1左移
{
if (Vector4.Distance(AssistClass.RectToVec4(pns[1].posRect), AssistClass.RectToVec4(winRects[1])) > 0.1f)
{
pns[1].posRect = AssistClass.Vec4ToRect(Vector4.Lerp(AssistClass.RectToVec4(pns[1].posRect), AssistClass.RectToVec4(winRects[1]), 0.1f));
}
else
{
pns[1].status = 0;
pns[1].pos = 1;
}
}
}
}