6.图片绘制和框

6.基础控件-图片绘制和框


6.1 知识点

图片绘制

DrawTexture静态方法 进行图片绘制

// 在一个矩形内绘制纹理。
GUI.DrawTexture(texPos, tex, mode, alpha, wh);

DrawTexture静态方法所有重载

//DrawTexture静态方法所有重载
//public static void DrawTexture(Rect position, Texture image);
//public static void DrawTexture(Rect position, Texture image, ScaleMode scaleMode);
//public static void DrawTexture(Rect position, Texture image, ScaleMode scaleMode, bool alphaBlend);
//public static void DrawTexture(Rect position, Texture image, ScaleMode scaleMode, bool alphaBlend, float imageAspect);

DrawTexture静态方法重载中的参数

  • ScaleMode:
    • 当图像的宽高比不适合要绘制的宽高比时,如何缩放图像。
    • ScaleAndCrop: 也会通过宽高比来计算图片 但是会进行裁剪。
    • ScaleToFit: 会自动根据宽高比进行计算 不会拉变形 会一直保持图片完全显示的状态。
    • StretchToFill: 始终填充满你传入的 Rect 范围。
  • alphaBlend:
    • 绘制图像时是否应用 Alpha 混合(默认启用)。
    • 用来控制图片是否开启透明通道。
  • imageAspect:
    • 用于源图像的宽高比。如果为 0(默认值),则使用图像的宽高比。传入 w/h 来指定所需的宽高比。这让您能够在不改变像素宽度和高度的情况下调整源图像的宽高比。

效果

框绘制

Box静态方法 框绘制

// 在 GUI 层上创建一个框。
GUI.Box(texPos, "123");

效果

6.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson06_基本控件_图片绘制和框 : MonoBehaviour
{
    public Rect texPos;

    public Texture tex;

    public ScaleMode mode = ScaleMode.StretchToFill;

    public bool alpha = true;

    public float wh = 0;

    private void OnGUI()
    {
        #region 知识点一 图片绘制

        //DrawTexture静态方法 进行图片绘制
        //在一个矩形内绘制纹理。
        GUI.DrawTexture(texPos, tex, mode, alpha, wh);

        //DrawTexture静态方法所有重载
        //public static void DrawTexture(Rect position, Texture image);
        //public static void DrawTexture(Rect position, Texture image, ScaleMode scaleMode);
        //public static void DrawTexture(Rect position, Texture image, ScaleMode scaleMode, bool alphaBlend);
        //public static void DrawTexture(Rect position, Texture image, ScaleMode scaleMode, bool alphaBlend, float imageAspect);

        //DrawTexture静态方法重载中的参数

        //ScaleMode
        //当图像的宽高比不适合要绘制的宽高比时,如何缩放图像。
        //ScaleAndCrop:也会通过宽高比来计算图片 但是 会进行裁剪
        //ScaleToFit:会自动根据宽高比进行计算 不会拉变形 会一直保持图片完全显示的状态
        //StretchToFill:始终填充满你传入的 Rect范围

        //alphaBlend
        //绘制图像时是否应用 Alpha 混合(默认启用)。
        //用来 控制 图片是否开启透明通道的

        //imageAspect
        //用于源图像的宽高比。如果为 0(默认值),则使用图像的宽高比。传入 w/h 来指定所需的宽高比。这让您能够在不改变像素宽度和高度的情况下调整源图像的宽高比。
        //自定义宽高比  如果不填 默认为0 就会使用 图片原始宽高  

        #endregion

        #region 知识点二 框绘制

        //Box静态方法 框绘制
        //在 GUI 层上创建一个框。
        GUI.Box(texPos, "123");

        #endregion
    }
}

6.3 练习题

为各个面板加上背景图片

给三个面板添加绘制背景代码

// 开始面板脚本
public class BeginPanel : MonoBehaviour
{
    // 背景图片
    public Rect bkPos;
    public Texture bkTex;

    private void OnGUI()
    {
        // 背景
        GUI.DrawTexture(bkPos, bkTex); // **API: GUI.DrawTexture**
        
        // 其他代码...
    }
}
// 设置面板脚本
public class SettingPanel : MonoBehaviour
{
    // 背景图片
    public Rect bkPos;
    public Texture bkTex;

    private void OnGUI()
    {
        // 背景
        GUI.DrawTexture(bkPos, bkTex); // **API: GUI.DrawTexture**
        
        // 其他代码...
    }
}
// 登陆面板脚本
public class LoginPanel : MonoBehaviour
{
    // 背景图片
    public Rect bkPos;
    public Texture bkTex;

    private void OnGUI()
    {
        // 背景
        GUI.DrawTexture(bkPos, bkTex); // **API: GUI.DrawTexture**
        
        // 其他代码...
    }
}

修改参数查看效果




6.4 练习题代码

BeginPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

#region 练习题一
//请用GUI制作一个游戏开始界面,上面有开始游戏,退出游戏,设置等等按钮选项,点击开始游戏可以切换到游戏场景

//开始面板
public class BeginPanel : MonoBehaviour
{
    //面板的显示隐藏 所有地方都能够快速使用的
    //静态 方法 和静态变量 就可以直接通过类名就用了
    private static BeginPanel instance;

    public static void ShowMe()
    {
        if(instance != null)
        {
            instance.gameObject.SetActive(true);
        }
    }

    public static void HideMe()
    {
        if (instance != null)
        {
            instance.gameObject.SetActive(false);
        }
    }

    //游戏标题
    public Rect labPos;
    public GUIContent labContent;
    public GUIStyle labStyle;

    //3个游戏按钮
    public Rect btn1Pos;
    public Rect btn2Pos;
    public Rect btn3Pos;
    public GUIStyle btnStyle;

    //背景
    public Rect bkPos;
    public Texture bkTex;

    private void Awake()
    {
        instance = this;
    }

    private void OnGUI()
    {
        //为之前的各个面板加上背景图片

        //背景
        GUI.DrawTexture(bkPos, bkTex);

        //游戏标题
        GUI.Label(labPos, labContent, labStyle);

        //3个游戏按钮
        if(GUI.Button(btn1Pos, "开始游戏", btnStyle))
        {
            //SceneManager.LoadScene("GameScene");
            LoginPanel.ShowMe();
            HideMe();
        }
        if(GUI.Button(btn2Pos, "设置游戏", btnStyle))
        {
            //显示设置界面
            SettingPanel.ShowMe();
            //隐藏自己
            HideMe();
        }
        if(GUI.Button(btn3Pos, "退出游戏", btnStyle))
        {
            QuitTipPanel.ShowMe();
            HideMe();
        }
    }
}
#endregion

SettingPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 练习题一
//在上一知识点练习题基础上,制作一个游戏设置面板,上面有背景音乐的开关和音效的开关,并且点击开始界面的设置面板可以打开设置面板

public class SettingPanel : MonoBehaviour
{
    //面板的显示隐藏 所有地方都能够快速使用的
    //静态 方法 和静态变量 就可以直接通过类名就用了
    private static SettingPanel instance;

    public static void ShowMe()
    {
        if (instance != null)
        {
            instance.gameObject.SetActive(true);
        }
    }

    public static void HideMe()
    {
        if (instance != null)
        {
            instance.gameObject.SetActive(false);
        }
    }

    //音乐开关和音效开关
    public Rect toggleMusicPos;
    public Rect toggleSoundPos;
    private bool isSelMusic = true;
    private bool isSelSound = true;

    //关闭按钮
    public Rect btnPos;
    public GUIStyle btnStyle;

    //请在上一知识点的练习题基础上,在设置面板中加入拖动条控制音乐大小
    private float musicValue = 1;
    public Rect musicPos;
    private float soundValue = 1;
    public Rect soundPos;

    //背景
    public Rect bkPos;
    public Texture bkTex;

    private void Awake()
    {
        instance = this;
        HideMe();
    }

    private void OnGUI()
    {
        //为之前的各个面板加上背景图片

        //背景
        GUI.DrawTexture(bkPos, bkTex);

        //音乐开关和音效开关
        isSelMusic = GUI.Toggle(toggleMusicPos, isSelMusic, "音乐开关");
        isSelSound = GUI.Toggle(toggleSoundPos, isSelSound, "音效开关");

        //拖动条
        musicValue = GUI.HorizontalSlider(musicPos, musicValue, 0, 1);
        soundValue = GUI.HorizontalSlider(soundPos, soundValue, 0, 1);

        //关闭按钮 设置面板
        if (GUI.Button(btnPos, "", btnStyle))
        {
            //关闭自己这个面板的功能
            HideMe();
            //显示开始界面
            BeginPanel.ShowMe();
        }
    }

    //总结
    //1.要完成 面板之间 相互控制显示 有3中方法
    //  第一种:都写在一个OnGUI中 通过bool标识去控制显影
    //  第二种:挂载在同一个对象上 通过控制脚本的 失活激活 enable去控制代码是否执行 达到显影
    //  第三种:挂载在不同对象上 通过控制对象的 失活激活 来达到 面板的显影

    //2.关键的 如何在多个面板之间相互调用显隐  我们是通过 静态变量和静态方法的形式
    //  在Awake时  初始化 静态变量  如果要用该方法 一开始 这个对象不能失活
}
#endregion

LoginPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

#region 练习题二
//请在之前的基础上,制作一个登陆面板,有用户名输入和密码输入,有进入游戏和返回上一级按钮,点击开始界面中的开始游戏后 进入登陆面板,输入的用户名为admin密码为8888才能切换场景

public class LoginPanel : MonoBehaviour
{
    //面板的显示隐藏 所有地方都能够快速使用的
    //静态 方法 和静态变量 就可以直接通过类名就用了
    private static LoginPanel instance;

    public static void ShowMe()
    {
        if (instance != null)
        {
            instance.gameObject.SetActive(true);
        }
    }

    public static void HideMe()
    {
        if (instance != null)
        {
            instance.gameObject.SetActive(false);
        }
    }

    //两个 按钮


    public Rect btn1Pos;
    public Rect btn2Pos;
    //两个 label
    public Rect lab1Pos;
    public Rect lab2Pos;
    //两个 输入框
    public Rect input1Pos;
    public Rect input2Pos;

    //用户名和密码
    private string userName = "";
    private string passWord = "";

    //背景
    public Rect bkPos;
    public Texture bkTex;

    private void Awake()
    {
        instance = this;
        HideMe();
    }

    private void OnGUI()
    {
        //为之前的各个面板加上背景图片

        //背景
        GUI.DrawTexture(bkPos, bkTex);

        //登录按钮
        if ( GUI.Button(btn1Pos, "登录游戏") )
        {
            if(userName == "admin" && passWord == "8888")
            {
                SceneManager.LoadScene("GameScene");
            }
            else
            {
                Debug.Log("用户名或者密码错误");
            }
        }

        //返回按钮
        if( GUI.Button(btn2Pos, "返回") )
        {
            BeginPanel.ShowMe();
            HideMe();
        }

        //文本
        GUI.Label(lab1Pos, "用户名");
        GUI.Label(lab2Pos, "密码");

        //输入框
        userName = GUI.TextField(input1Pos, userName);
        passWord = GUI.PasswordField(input2Pos, passWord, '*');
    }
}
#endregion


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏