点击触发器更改Gui.Button皮肤

时间:2015-09-08 12:01:57

标签: c# unity3d

我有下面的脚本,当用户点击按钮并删除一些“钱”时,我正在尝试更改Gui.Skin。

// Converted from UnityScript to C# at http://www.M2H.nl/files/js_to_c.php - by Mike Hergaarden
// Do test the code! You usually need to change a few small bits.

using UnityEngine;
using System.Collections;

public class Shop : MonoBehaviour {
    //variables----------------------------------------
    public bool ShowShop = false;
    public Texture CoinTexture;
    public int Money = 0;
    public GUISkin skin = null;
    public GUISkin bought = null;
    public bool AddButton= false;
    //Items:
    //to add more items just copy this variable and add the item name;

    //code----------------------------------------
    void  Start (){}

    void  Update (){
        if(Money <= 0){
            Money = 0;
        }
    }

    private void OnGUI (){
        GUI.skin = skin;
        if(ShowShop ==true){
            //money{********************-------------------------------------------------------------**************************
            GUI.Button( new Rect(Screen.width/60,Screen.height/35  ,50,50), CoinTexture);
            GUI.Button( new Rect(Screen.width/60+50,Screen.height/35  ,70,50), ""+Money);
            if(AddButton ==true){
                if(GUI.Button( new Rect(Screen.width/60+120,Screen.height/35  ,70,50), "Add")){
                    Money += 100;
                }
            }
            //money}***********************-------------------------------------------------------------------*****************************

            //Items(Shop){
            if(GUI.Button( new Rect(20, 70 , 120, 120), "Buy: 100")){
                if(Money >= 100){
                    Money -= 100;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(140, 70, 120, 120), "Buy: 200")){
                if(Money >= 200){
                    Money -= 200;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(260, 70, 120, 120), "Buy: 300")){
                if(Money >= 300){
                    Money -= 300;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(380, 70, 120, 120), "Buy: 400")){
                if(Money >= 400){
                    Money -= 400;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(20, 190 , 120, 120), "Buy: 500")){
                if(Money >= 500){
                    Money -= 500;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(140, 190, 120, 120), "Buy: 600")){
                if(Money >= 600){
                    Money -= 600;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(260, 190, 120, 120), "Buy: 700")){
                if(Money >= 700){
                    Money -= 700;
                }else{
                    Money -=0;
                }
            }
            if(GUI.Button( new Rect(380, 190, 120, 120), "Buy: 800")){
                if(Money >= 800){
                    Money -= 800;
                }else{
                    Money -=0;
                }
            }

        }
    }
}

下面的这部分工作完美,它减去了用户的钱。正如您在脚本顶部所见,我有Public GUISkin skin = nullPublic GUISkin bought = null

当有人点击按钮时,我想将guiskin从skin更改为bought

if(GUI.Button( new Rect(20, 70 , 120, 120), "Buy: 100")){
    if(Money >= 100){
        Money -= 100;
        this.Skin = bought; // THIS IS WHAT I HAVE TRIED
    }else{
        Money -=0;
    }
}

我似乎无法找到任何办法 - 有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用GUI.skin = bought;,因为“this”代表您的组件行为,而不是您的GUI对象this.Skin不以任何方式引用当前的GUI.skin ......

同样设置GUI.skin将在此之后更改所有GUI绘制以使用新外观,因此如果您只想更改当前按下的按钮,您可能会改变它的样式而不是整个GUI外观。有很多方法可以实现这一点,如果要为所有GUI元素设置外观,我建议你这样做:

  1. 在你开始你的游戏/场景时只改变你的GUI.skin以使你的个人GUISkin工作(一个简单的方法是在每个OnGUI()的开头,但不是寻找性能的更好方法);
  2. 在GUISkin自定义样式数组上创建自定义样式;
  3. 在声明GUI元素时,如GUI.Button传递所需的自定义样式,如GUI.Button(myRect,“myLabel”,“myCustomStyleName”);
  4. 当需要时,具有2个状态(激活和停用)的按钮使用GUI.Toogle而不是GUI.Button(更容易设计样式)。
  5. 有关更多信息和更好地了解皮肤,请阅读manual,以避免在您只想更改元素样式时更改整个皮肤的麻烦。

    请注意,OnGUI()函数每帧调用两次或更多次,并实例化一个新的Rect作为参数来协调每个元素,如GUI.Button(**new Rect(x,y,w,h)**, "myButton"),可能会导致性能低下的问题(并且您也会将数学运算到声明中,因此可能你需要使用GUILayout或更改你的坐标声明,以便在需要时重新计算。