Unity使用打成图集的Sprite作为模型贴图使用的问题

这篇具有很好参考价值的文章主要介绍了Unity使用打成图集的Sprite作为模型贴图使用的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  大家好,我是阿赵。
  有时候用Unity引擎做项目的时候,会遇到这样的需求,美术做了一些模型或者特效,然后策划想在游戏运行的时候,读取一些游戏图标放在特效或者模型上面当做贴图使用。
  这个需求实现起来很简单,比如这样:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  我这里随便找了一些icon图片,在Unity里面设置成了Sprite的贴图类型。并且输入了Packing Tag,意思是这些图片将会作为一个图集来使用。
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  然后我建了一个面片,当做模型。
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  接下来写代码了,代码很简单:

    private void SetTextureBySprite(Sprite sp)
    {
        render.material.SetTexture("_MainTex", sp.texture);
	}

  在编辑器里面执行代码,会发现贴图被赋予上去了:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  不过,如果我们实际打包游戏运行之后,会发现效果是不对的:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  为什么会出现编辑器和实际打包运行效果不一致的情况呢?
  这是因为上面我设置了Packing Tag,这样,同一个Tag的图片,将会打包成一个图集。
  由于打图集的时间比较长,所以一般来说在编辑器环境下,会把图集取消掉:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  勾选Disabled或者Enabled For Builds,在编辑器都是不打图集就运行的。
  如果想在编辑器里面就能看到图集效果,要选Always Enabled,这样编辑器里面运行的效果就和打包之后的效果一致了。不过这样每次图集里面的图片有改动时,Unity会先重新生成图集,会比较慢。
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  用SpritePacker看一下:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  在实际运行中,这些icon的贴图不再是单张的Texture,而是组合成这样一张贴图了。
  再查看一下Unity的API:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  里面很明确的说明了,假如packed了,sprite.texture指向的是整个图集。
  怎样解决这个问题呢?
  再继续看Unity的API:
unity使用未知图集中的sprite,Unity功能与问题解决,unity,贴图,游戏引擎,Sprite,图集

  Unity提供了textureRect的API,可以把原来的Sprite在现在整张图集所占的位置通过Rect返回。于是我们就可以用这个Rect来计算,实际的Sprite占整张图集的位置,也就是求出了采样的UV坐标了:

    private void SetTextureBySpriteRect(Sprite sp)
    {
        Texture2D tex = sp.texture;
        float texWidth = tex.width;
        float texHeight = tex.height;
        Rect rect = sp.textureRect;
        Vector4 uv =new  Vector4(rect.width / texWidth, rect.height / texHeight, rect.x/tex.width, rect.y/tex.height);
        render.material.SetTexture("_MainTex", sp.texture);
        render.material.SetVector("_MainTex_ST", uv);
	}

  这里注意的是,求出的UV,是通过SetVector设置进材质球的,用的变量名_MainTex_ST是对应主贴图_MainTex的,熟悉写Shader的朋友应该都知道,你声明了一张贴图置换,贴图名称后面接_ST就是这张贴图的UV。
  所以这里通过_MainTex_ST设置UV不是固定的,要根据你实际的贴图名称来改。
  最后运行代码,这次显示就应该是正确的了,其实这里面的原理,和之前说的地形局部采样UV是一样的。文章来源地址https://www.toymoban.com/news/detail-815499.html

到了这里,关于Unity使用打成图集的Sprite作为模型贴图使用的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity2021 Sprite图像不显示 问题解决

    创建Sprite后 图片在Scene中显示,在Game中却无法显示。 问题出在Camera未照到 解决办法: 点击Camera,调整位置,直到图片显示。  

    2024年02月16日
    浏览(31)
  • Unity如何实现让Sprite和UI显示在模型前面而不会被模型遮挡

    在不使用Shader的情况下实现UI显示在模型前面方法 ps:本人只做记笔记使用 使用前: 使用后: 1.首先需要把显示的UI或者Sprite的层级设置为UI层或者你自定义的层 2.创建俩个摄像机 3.主摄像机不变,需要渲染的层级依旧是Everything 次摄像机的CullingMask只选择UI或者自定义层,以

    2024年02月22日
    浏览(26)
  • Unity 解决SpriteAtlas图集打包AssetBundle白图问题

    之前文档上说勾选了Include in build之后,就不需要自己增加一个Binding脚本,但是仍然会弹出警告,并且会出现白图现象 Tight Packing 勾选之后当Sprite有透明通道可能会出现错位 不推荐勾选 选项取消勾选之后打包AssetBundle会报警告 并且出现白图现象 那是因为没有进行bing  Sprite

    2024年02月11日
    浏览(27)
  • Unity SpriteAtlas 打图集流程,与遇到的问题和解决方法

    在unity里面使用 SpriteAtlas ,把需要用到的游戏贴图资源,创建成对应的图集。 贴图资源没有打进包里面,如果以文本的方式打开图集,会发现文本里面关于m_PackedSprites的数组和m_PackedSpriteNamesToIndex的数组都是为空的,没有值在里面,没有值的这两个变量,是用不了对应的贴图

    2024年02月16日
    浏览(30)
  • Unity 优化贴图模型

    纹理 纹理属性 Aplha Source 对于不透明的纹理,关闭其apha通道 Read/Write Enable:如果你不需要运行时读取图片的像素信息的话, 禁用 ,否则启用后纹理的内存消耗会增加一倍。 Streaming MipMaps:如果不是3D模型贴图,则 禁用 ,否则会多出约33%的内存开销。Mipmaps主要为远处的物件

    2024年02月11日
    浏览(26)
  • Unity导入模型贴贴图一面有贴图另一面透明的解决方法

    如图所示,房子里面可以看见外面,是透明的。  材质shader这里是Standard 改为如图   然后会发现 如果没有勾选勾选了就可以了!     

    2024年02月16日
    浏览(26)
  • 【Unity】Unity导入fbx文件无贴图问题(白模)

    1.先使用3dmax打开fbx模型,打开后会在文件所在目录下生成一个.fbm文件夹(重要),这个后续会用到。 2.直接将模型导出,设置里勾选 “嵌入的媒体” 3.将重新导出的fbx模型和第1步中的fbm文件夹一起放入unity中,在fbx模型设置处点击“Extract Materials”,选择对应的fbm文件夹。

    2024年02月05日
    浏览(30)
  • Unity - 实现模型动态伸长缩短,贴图不变形(材质球参数篇)

     思路为修改模型材质球的Tiling参数,根据与自身localScale的值得到合适的比例,再修改Tiling值

    2024年02月03日
    浏览(33)
  • Sprite Editor图片编辑器的使用_unity基础开发教程

    SpriteEditor是Unity引擎中的一个工具,用于创建和编辑2D图片。它提供了一系列功能,可以对图片进行剪裁、切割、翻转、旋转、调整大小等操作,以及设置图片的碰撞检测形状和渲染模式。 SpriteEditor可以帮助开发者将多张图片合并成动画精灵,并为每一帧设置播放时间和循环

    2024年02月01日
    浏览(29)
  • Unity2D Sprite尺寸与UI在场景视图和游戏视图显示不一致问题解决方案

    在Unity3D中,当开发2D游戏时,经常会遇到Sprite尺寸与UI在场景视图和游戏视图中显示不一致的问题。这个问题可能导致UI元素变形或者在不同分辨率的设备上显示不正确。本文将为您提供解决这个问题的方法,并附带相应的源代码。 问题分析: Sprite是2D游戏中最常用的图像资

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包