GUI-按钮变换

终于决定把自己的代码放出来了,从构思到写代码用了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;
            }
        }
      
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值