12.SpriteRenderer精灵渲染器

  1. 12.2D相关-Sprite-SpriteRenderer精灵渲染器
    1. 12.1 知识点
      1. Sprite知识回顾
      2. SpriteRenderer组件是什么
      3. 2D对象创建
        1. 直接拖入Sprite图片
        2. 右键创建
        3. 空物体添加脚本
      4. SpriteRenderer精灵渲染器组件参数
        1. Sprite 精灵
        2. Color 颜色
        3. Filp 翻转
        4. Draw Mode 绘制模式:
          1. Simple 简单
          2. Sliced 已切片
          3. Tiled 已平铺
            1. Tile Mode 平铺模式
        5. Mask Interaction 遮罩交互:
          1. None 无
          2. Visible inside Mask 遮罩中可见
          3. Visible Outside Mask 遮罩外可见
        6. Sprite Sort Point Sprite 排序点
        7. Material 材质:
        8. Additional Settings 其他设置
        9. Sorting Layer 排序图层
        10. Order in Layer 图层顺序
      5. Sprite_SpriteRenderer精灵渲染器代码控制
        1. SpriteRenderer.sprite变量 当前渲染的精灵图片
      6. 总结
    2. 12.2 知识点代码
    3. 12.3 练习题
      1. 写一个工具类,让我们可以更加方便的加载Multiple类型的图集资源
        1. 创建Multiple类型的图集管理类,搞成单例
        2. 创建一个字典,用于存储大图对应的小图资源的信息。
        3. 创建获取Multiple图集中的某一张小图GetSprite方法,GetSprite方法用于获取Multiple图集中的某一张小图。它接受两个参数:multipleName表示图集名称,spriteName表示单张图片名称。该方法首先检查是否已经加载过该大图,如果已经加载过,则检查大图中是否有该小图的信息。如果有,则返回对应的Sprite对象。如果没有加载过该大图,则创建一个临时字典,并使用Resources.LoadAll方法加载所有Sprite对象。然后将这些Sprite对象添加到临时字典中,并将临时字典添加到dic字典中。最后,检查临时字典中是否有指定名称的小图,如果有,则返回对应的Sprite对象。
        4. 创建清空字典中的信息,并卸载未使用的资源的ClearInfo方法,ClearInfo方法用于清除信息。它首先清空dic字典,然后调用Resources.UnloadUnusedAssets方法卸载未使用的资源。
        5. 在主脚本创建空物体,添加精灵渲染器组件,使用我们写好的Multiple类型的图集管理类设置精灵图片进行测试
      2. 用提供的角色资源,制作一个通过wasd键 控制其上下左右移动的功能
        1. 拖一个2D精灵进Scene中,设置其轴心点为脚底下。
        2. 创建PlayerObject脚本,把刚刚的2D精灵对象名改成Player,挂载PlayerObject脚本
        3. PlayerObject类
    4. 12.4 练习题代码
      1. Lesson12_练习题
      2. MultipleMgr
      3. Lesson12_练习题_PlayerObject

12.2D相关-Sprite-SpriteRenderer精灵渲染器


12.1 知识点

Sprite知识回顾

  • 我们目前已经学习了如何设置导入的图片
  • 如果我们想将导入的图片用于2D游戏开发,需要将图片类型设置为 Sprite精灵类型
  • 我们还学习了使用Sprite Editor精灵图片编辑器来对精灵图片进行编辑
  • 但是我们还没有真正的使用这些图片
  • 这节课我们就来讲解Sprite精灵图片的使用

SpriteRenderer组件是什么

  • 顾名思义,Sprite Renderer是精灵渲染器 是一个组件
  • 所有2D游戏中游戏资源(除UI外)都是通过Sprite Renderer让我们看到的
  • 它是2D游戏开发中的一个极为重要的组件

2D对象创建

直接拖入Sprite图片

右键创建


空物体添加脚本


SpriteRenderer精灵渲染器组件参数


Sprite 精灵

  • 渲染的精灵图片

Color 颜色

  • 定义着色,一般没有特殊需求不会修改
  • 可以用来做受伤闪烁功能

Filp 翻转

  • 水平或竖直翻转精灵图片

Draw Mode 绘制模式:

  • 当尺寸变化时的缩放方式
Simple 简单
  • 缩放时整个图像一起缩放
Sliced 已切片
  • 切片模式,9宫格切片模式,十字区域缩放,4个角不变化
  • 一般用于变化不大的纯色图
  • 注意:需要把精灵的MeshType网格类型设置为Full Rect全矩形


Tiled 已平铺
  • 平铺模式,将九宫格中间部分进行平铺而不是缩放
  • 注意:需要把精灵的MeshType网格类型设置为Full Rect全矩形
Tile Mode 平铺模式


  • Continuous 持续:当尺寸变化时,中间部分将均匀平铺
  • Adaptive:当尺寸变化时,类似Simple模式,当更改尺寸达到Stretch Value 伸展值时,中间才开始平铺
    • 说人话就是,拉长一点,一开始不会出新的图像进行平铺。拉长过一定的值后再出。

Mask Interaction 遮罩交互:

  • 与精灵遮罩交互时的方式
None 无
  • 不与场景中任何精灵遮罩交互
Visible inside Mask 遮罩中可见
  • 精灵遮罩覆盖的地方可见,而遮罩外部不可见
Visible Outside Mask 遮罩外可见
  • 精灵遮罩外部的地方可见,而遮罩覆盖处不可见

Sprite Sort Point Sprite 排序点

  • 计算摄像机和精灵之间距离时,使用精灵中心Center还是轴心点Pivot,一般情况下不用修改

Material 材质:

  • 可以使用一些自定义材质来显示一些特殊效果
  • 一般情况不修改,默认材质是不会受到光照影响的,如果想要受光照影响,可以选择Default-Diffuse

Additional Settings 其他设置

  • 高级设置

Sorting Layer 排序图层

  • 排序层选择
  • 排序层一样的话会,谁先显示谁后显示是受z轴影响的
  • 可以新增加排序层,排序层越前,显示越前面,会越后面渲染

Order in Layer 图层顺序

  • 层级序列号,数值越大越会显示在前面
  • 先会比较排序图层,再比较图层顺序的

Sprite_SpriteRenderer精灵渲染器代码控制

SpriteRenderer.sprite变量 当前渲染的精灵图片

//新建空物体
GameObject gameObject = new GameObject();

//添加精灵渲染器组件
SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();

//SpriteRenderer类中sprite变量 当前渲染的精灵图片 传入精灵图片名字
//要渲染的精灵。
//动态的改变图片
spriteRenderer.sprite = Resources.Load<Sprite>("dead1");

//动态的加载 图集中的图 传入图集名字
Sprite[] sprites = Resources.LoadAll<Sprite>("RobotBoyIdleSprite");
//动态的改变成图集中的图片
spriteRenderer.sprite = sprites[10];
print(sprites[10].name);//RobotBoyIdleSprite_10

总结

  • 主要掌握参数含义 和 如何代码控制
  • 其中重要的参数是
    • 绘制模式 控制缩放规则
    • 遮罩相关
    • 层级相关

12.2 知识点代码

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

public class Lesson12_2D相关_Sprite_SpriteRenderer精灵渲染器 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 Sprite知识回顾
        //我们目前已经学习了如何设置导入的图片
        //如果我们想将导入的图片用于2D游戏开发,需要将图片类型设置为 Sprite精灵类型  

        //我们还学习了使用Sprite Editor精灵图片编辑器来对精灵图片进行编辑

        //但是我们还没有真正的使用这些图片
        //这节课我们就来讲解Sprite精灵图片的使用
        #endregion

        #region 知识点二 Sprite Renderer是什么
        //顾名思义,Sprite Renderer是精灵渲染器 是一个组件
        //所有2D游戏中游戏资源(除UI外)都是通过Sprite Renderer让我们看到的
        //它是2D游戏开发中的一个极为重要的组件
        #endregion

        #region 知识点三 2D对象创建
        //1.直接拖入Sprite图片
        //2.右键创建
        //3.空物体添加脚本
        #endregion

        #region 知识点四 SpriteRenderer精灵渲染器参数讲解

        #endregion

        #region 知识点五 Sprite_SpriteRenderer精灵渲染器代码设置相关

        //新建空物体
        GameObject gameObject = new GameObject();

        //添加精灵渲染器组件
        SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();

        //SpriteRenderer类中sprite变量 当前渲染的精灵图片 传入精灵图片名字
        //要渲染的精灵。
        //动态的改变图片
        spriteRenderer.sprite = Resources.Load<Sprite>("dead1");

        //动态的加载 图集中的图 传入图集名字
        Sprite[] sprites = Resources.LoadAll<Sprite>("RobotBoyIdleSprite");
        //动态的改变成图集中的图片
        spriteRenderer.sprite = sprites[10];
        print(sprites[10].name);//RobotBoyIdleSprite_10

        #endregion

        #region 总结
        //主要掌握参数含义 和 如何代码控制
        //其中重要的参数是
        //1.绘制模式 控制缩放规则
        //2.遮罩相关
        //3.层级相关
        #endregion
    }
}

12.3 练习题

写一个工具类,让我们可以更加方便的加载Multiple类型的图集资源

创建Multiple类型的图集管理类,搞成单例

//Multiple类型的图集管理类
public class MultipleMgr
{
    //单例模式
    private static MultipleMgr instance = new MultipleMgr();
    public static MultipleMgr Instatnce => instance;
    private MultipleMgr()
    {

    }
}

创建一个字典,用于存储大图对应的小图资源的信息。

//存储 大图对应的小图资源的信息
private Dictionary<string, Dictionary<string, Sprite>> dic = new Dictionary<string, Dictionary<string, Sprite>>();

创建获取Multiple图集中的某一张小图GetSprite方法,GetSprite方法用于获取Multiple图集中的某一张小图。它接受两个参数:multipleName表示图集名称,spriteName表示单张图片名称。该方法首先检查是否已经加载过该大图,如果已经加载过,则检查大图中是否有该小图的信息。如果有,则返回对应的Sprite对象。如果没有加载过该大图,则创建一个临时字典,并使用Resources.LoadAll方法加载所有Sprite对象。然后将这些Sprite对象添加到临时字典中,并将临时字典添加到dic字典中。最后,检查临时字典中是否有指定名称的小图,如果有,则返回对应的Sprite对象。

/// <summary>
/// 获取Multiple图集中的某一张小图
/// </summary>
/// <param name="multipleName">图集名</param>
/// <param name="spriteName">单张图片名</param>
/// <returns>返回获取到的Sprite</returns>
public Sprite GetSprite(string multipleName, string spriteName)
{
    //判断是否加载过该大图
    if (dic.ContainsKey(multipleName))
    {
        //判断大图中是否有该小图的信息 有的话直接返回
        if (dic[multipleName].ContainsKey(spriteName))
            return dic[multipleName][spriteName];
    }

    //如果没有加载过该大图
    else
    {
        //则加载该大图 并创建一个临时字典准备用于存储小图
        Dictionary<string, Sprite> dicTmp = new Dictionary<string, Sprite>();
        Sprite[] sprs = Resources.LoadAll<Sprite>(multipleName);

        //将其对应的小图信息存储到字典中
        for (int i = 0; i < sprs.Length; i++)
        {
            dicTmp.Add(sprs[i].name, sprs[i]);
        }

        //将临时字典存储到 存储 大图对应的小图资源的信息 的字典
        dic.Add(multipleName, dicTmp);

        //判断 是否有该名字的小图 有的话直接返回
        if (dicTmp.ContainsKey(spriteName))
            return dicTmp[spriteName];
    }

    //没有返回空
    return null;
}

创建清空字典中的信息,并卸载未使用的资源的ClearInfo方法,ClearInfo方法用于清除信息。它首先清空dic字典,然后调用Resources.UnloadUnusedAssets方法卸载未使用的资源。

/// <summary>
/// 清空字典中的信息,并卸载未使用的资源
/// </summary>
public void ClearInfo()
{
    //清空字典中的信息
    dic.Clear();
    //卸载未使用的资源
    Resources.UnloadUnusedAssets();
}

在主脚本创建空物体,添加精灵渲染器组件,使用我们写好的Multiple类型的图集管理类设置精灵图片进行测试

//提示:提供一个方法给外部,传入一个图集的名字,和这个单张图的名字

//创建空物体
GameObject obj = new GameObject();
//添加精灵渲染器组件
SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();

//使用我们写好的Multiple类型的图集管理类设置精灵图片
sr.sprite = MultipleMgr.Instatnce.GetSprite("RobotBoyIdleSprite", "RobotBoyIdleSprite_16");

用提供的角色资源,制作一个通过wasd键 控制其上下左右移动的功能

拖一个2D精灵进Scene中,设置其轴心点为脚底下。

创建PlayerObject脚本,把刚刚的2D精灵对象名改成Player,挂载PlayerObject脚本

PlayerObject类

public class Lesson12_练习题_PlayerObject : MonoBehaviour
{
    // 玩家移动速度
    public float moveSpeed = 5;
    // 水平方向输入值
    private float h;

    // SpriteRenderer组件
    private SpriteRenderer sr;

    // Start方法在脚本实例被加载时调用
    void Start()
    {
        // 获取SpriteRenderer组件
        sr = this.GetComponent<SpriteRenderer>();
    }

    // Update方法在每一帧中都会被调用
    void Update()
    {
        // 获取水平方向输入值
        h = Input.GetAxis("Horizontal");
        // 移动玩家对象
        this.transform.Translate(5 * Time.deltaTime * Vector3.right * h);
        // 如果h小于0,则设置sr.flipX为true,否则如果h大于0,则设置sr.flipX为false
        if (h < 0)
            sr.flipX = true;
        else if (h > 0)
            sr.flipX = false;
    }
}

12.4 练习题代码

Lesson12_练习题

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

public class Lesson12_练习题 : MonoBehaviour
{
    void Start()
    {
        #region 练习题一
        //写一个工具类,让我们可以更加方便的加载Multiple类型的图集资源

        //提示:提供一个方法给外部,传入一个图集的名字,和这个单张图的名字

        //创建空物体
        GameObject obj = new GameObject();
        //添加精灵渲染器组件
        SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();

        //使用我们写好的Multiple类型的图集管理类设置精灵图片
        sr.sprite = MultipleMgr.Instatnce.GetSprite("RobotBoyIdleSprite", "RobotBoyIdleSprite_16");

        #endregion

        #region 练习题二
        //用我提供的角色资源,制作一个通过wasd键 控制其上下左右移动的功能
        #endregion
    }
}

MultipleMgr

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

//Multiple类型的图集管理类
public class MultipleMgr
{
    //单例模式
    private static MultipleMgr instance = new MultipleMgr();
    public static MultipleMgr Instatnce => instance;
    private MultipleMgr()
    {

    }

    //存储 大图对应的小图资源的信息 的字典
    private Dictionary<string, Dictionary<string, Sprite>> dic = new Dictionary<string, Dictionary<string, Sprite>>();

    /// <summary>
    /// 获取Multiple图集中的某一张小图
    /// </summary>
    /// <param name="multipleName">图集名</param>
    /// <param name="spriteName">单张图片名</param>
    /// <returns>返回获取到的Sprite</returns>
    public Sprite GetSprite(string multipleName, string spriteName)
    {
        //判断是否加载过该大图
        if (dic.ContainsKey(multipleName))
        {
            //判断大图中是否有该小图的信息 有的话直接返回
            if (dic[multipleName].ContainsKey(spriteName))
                return dic[multipleName][spriteName];
        }

        //如果没有加载过该大图
        else
        {
            //则加载该大图 并创建一个临时字典准备用于存储小图
            Dictionary<string, Sprite> dicTmp = new Dictionary<string, Sprite>();
            Sprite[] sprs = Resources.LoadAll<Sprite>(multipleName);

            //将其对应的小图信息存储到字典中
            for (int i = 0; i < sprs.Length; i++)
            {
                dicTmp.Add(sprs[i].name, sprs[i]);
            }

            //将临时字典存储到 存储 大图对应的小图资源的信息 的字典
            dic.Add(multipleName, dicTmp);

            //判断 是否有该名字的小图 有的话直接返回
            if (dicTmp.ContainsKey(spriteName))
                return dicTmp[spriteName];
        }

        //没有返回空
        return null;
    }

    /// <summary>
    /// 清空字典中的信息,并卸载未使用的资源
    /// </summary>
    public void ClearInfo()
    {
        //清空字典中的信息
        dic.Clear();
        //卸载未使用的资源
        Resources.UnloadUnusedAssets();
    }
}

Lesson12_练习题_PlayerObject

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

public class Lesson12_练习题_PlayerObject : MonoBehaviour
{
    // 玩家移动速度
    public float moveSpeed = 5;
    // 水平方向输入值
    private float h;

    // SpriteRenderer组件
    private SpriteRenderer sr;

    // Start方法在脚本实例被加载时调用
    void Start()
    {
        // 获取SpriteRenderer组件
        sr = this.GetComponent<SpriteRenderer>();
    }

    // Update方法在每一帧中都会被调用
    void Update()
    {
        // 获取水平方向输入值
        h = Input.GetAxis("Horizontal");
        // 移动玩家对象
        this.transform.Translate(5 * Time.deltaTime * Vector3.right * h);
        // 如果h小于0,则设置sr.flipX为true,否则如果h大于0,则设置sr.flipX为false
        if (h < 0)
            sr.flipX = true;
        else if (h > 0)
            sr.flipX = false;
    }
}


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

×

喜欢就点赞,疼爱就打赏