分别修改Cube每个面的贴图UV(Unity3D开发之十八)
猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/46611169
今天项目中需要修改一个Cube中每个面的贴图UV,也就是贴图中有多个矩形贴图,需要程序从贴图中读取一部分赋值给Cube每个面。
这里已经有人实现了。
CustomUVS.cs
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class CustomUVS : MonoBehaviour {
public Vector2 topPoint;
public Vector2 bottomPoint;
public Vector2 leftPoint;
public Vector2 rightPoint;
public Vector2 frontPoint;
public Vector2 backPoint;
private Mesh m_mesh;
public enum CubeFaceType
{
Top,
Bottom,
Left,
Right,
Front,
Back
};
// Use this for initialization
void Start () {
MeshFilter meshFilter = GetComponent<MeshFilter>();
if (meshFilter == null) {
Debug.LogError("Script needs MeshFilter component");
return;
}
#if UNITY_EDITOR
Mesh meshCopy = Mesh.Instantiate(meshFilter.sharedMesh) as Mesh; // Make a deep copy
meshCopy.name = "Cube";
m_mesh = meshFilter.mesh = meshCopy; // Assign the copy to the meshes
#else
m_mesh = meshFilter.mesh;
#endif
if (m_mesh == null || m_mesh.uv.Length != 24) {
Debug.LogError("Script needs to be attached to built-in cube");
return;
}
UpdateMeshUVS();
}
// Update is called once per frame
void Update ()
{
#if UNITY_EDITOR
UpdateMeshUVS();
#endif
}
void UpdateMeshUVS()
{
Vector2[] uvs = m_mesh.uv;
// Front
SetFaceTexture(CubeFaceType.Front, uvs);
// Top
SetFaceTexture(CubeFaceType.Top, uvs);
// Back
SetFaceTexture(CubeFaceType.Back, uvs);
// Bottom
SetFaceTexture(CubeFaceType.Bottom, uvs);
// Left
SetFaceTexture(CubeFaceType.Left, uvs);
// Right
SetFaceTexture(CubeFaceType.Right, uvs);
m_mesh.uv = uvs;
}
Vector2[] GetUVS(float originX, float originY)
{
Vector2[] uvs = new Vector2[4];
uvs[0] = new Vector2(originX / 3.0f, originY / 3.0f);
uvs[1] = new Vector2((originX + 1) / 3.0f, originY / 3.0f);
uvs[2] = new Vector2(originX / 3.0f, (originY + 1) / 3.0f);
uvs[3] = new Vector2((originX + 1) / 3.0f, (originY + 1) / 3.0f);
return uvs;
}
void SetFaceTexture(CubeFaceType faceType, Vector2[] uvs)
{
if (faceType == CubeFaceType.Front) {
Vector2[] newUVS = GetUVS(frontPoint.x, frontPoint.y);
uvs[0] = newUVS[0];
uvs[1] = newUVS[1];
uvs[2] = newUVS[2];
uvs[3] = newUVS[3];
}else if (faceType == CubeFaceType.Back) {
Vector2[] newUVS = GetUVS(backPoint.x, backPoint.y);
uvs[10] = newUVS[0];
uvs[11] = newUVS[1];
uvs[6] = newUVS[2];
uvs[7] = newUVS[3];
}else if (faceType == CubeFaceType.Top) {
Vector2[] newUVS = GetUVS(topPoint.x, topPoint.y);
uvs[8] = newUVS[0];
uvs[9] = newUVS[1];
uvs[4] = newUVS[2];
uvs[5] = newUVS[3];
}else if (faceType == CubeFaceType.Bottom) {
Vector2[] newUVS = GetUVS(bottomPoint.x, bottomPoint.y);
uvs[12] = newUVS[0];
uvs[14] = newUVS[1];
uvs[15] = newUVS[2];
uvs[13] = newUVS[3];
}else if (faceType == CubeFaceType.Left) {
Vector2[] newUVS = GetUVS(leftPoint.x, leftPoint.y);
uvs[16] = newUVS[0];
uvs[18] = newUVS[1];
uvs[19] = newUVS[2];
uvs[17] = newUVS[3];
}else if (faceType == CubeFaceType.Right) {
Vector2[] newUVS = GetUVS(rightPoint.x, rightPoint.y);
uvs[20] = newUVS[0];
uvs[22] = newUVS[1];
uvs[23] = newUVS[2];
uvs[21] = newUVS[3];
}
}
}
使用的贴图
给一个Cube添加改图片材质。并添加CustomUVS.cs脚本。修改需要截取的区域原点
注意:由于图片是3x3的,所以截取区域中按3等分截取。
实际效果
分别修改Cube每个面的贴图UV(Unity3D开发之十八)的更多相关文章
- 分别改动Cube每一个面的贴图UV(Unity3D开发之十八)
猴子原创.欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/46611169 ...
- Unity2D Sprite灰白图(Unity3D开发之十一)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=596 昨晚看到群里问到2DSpr ...
- 如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/44957631 ...
- Unity光照图UV显示
美术的同学觉得 Unity 光照图烘焙的不够美丽,需要在 ps 里修一修,但是不知道每个物体对应的光照图在哪个区域,UV 是如何分布的,于是要求写一个工具显示,于是有了下面这个: 打开场景自动读取当前 ...
- PowerShell安全修改Windows 10 登陆背景图
PowerShell安全修改Windows 10 登陆背景图 可以把登陆的背景图换掉,主要是修改操作pri文件 $priPath = "$env:windir\SystemResources ...
- 做一个会PS切图的前端开发
系列链接 做一个会使用PS的前端开发 做一个会PS切图的前端开发 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的 ...
- 美图秀秀 web开发图片编辑器
美图秀秀web开发平台 http://open.web.meitu.com/wiki/ 1.环境配置 1.1.设置crossdomain.xml 下载crossdomain.xml文件,把解压出来的c ...
- Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...
- 开源、免费功能全面的Chart图
简介: 每个前端都有一个Chart梦,至于真正去做的寥寥无几,无怪乎几个原因: 浏览器兼容问题 数据处理的一些算法,如自动计算坐标轴.自动排列文本等 流畅的动画 丰富的交互功能 去年一年的时间里,我一 ...
随机推荐
- Python 3 re模块3个括号相关的语法
(?aiLmsux) (One or more letters from the set 'a', 'i', 'L', 'm', 's', 'u', 'x'.) The group matches t ...
- 反射模拟DbUtils实现ResultSet转成Bean实例
前几天接触到了apache的一个小框架DbUtils,真的被其优雅的设计所震撼到了,尤其是其中的 MyBean mybean = QueryRunner.query(sqlConnection,sql ...
- 【一天一道LeetCode】#171. Excel Sheet Column Number
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- FND Debug Log(FND_LOG_MESSAGES)
之前每个模块记录日志的方式都不同,都会把日志写到不同的文件中,对于User来说很麻烦,需要记住很多的配置,现在越来越多的模块使用FND Logging来存储日志,比如WIP,RCV,OAF...FND ...
- Eclipse中查看没有源码的Class文件的方法
本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...
- UNIX环境高级编程——创建与打开IPC通道
创建或打开一个IPC对象的三个getXXX函数的第一个参数key是类型为key_t的IPC键,返回值identifier是一个整数标识符.该标识符不同于ftok函数的id参数.对于key值,应用程序有 ...
- TCP的定时器系列 — 保活定时器
主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepaliv ...
- Oracle PL/SQL Articles
我是搬运工....http://www.oracle-base.com/articles/plsql/articles-plsql.php Oracle 8i Oracle 9i Oracle 10g ...
- 【leetcode73】经典算法-Guess Number Higher or Lower
题目描述: 从1-n中,随便的拿出一个数字,你来猜测. 提示 提供一个guess(int num)的api,针对猜测的数字,返回三个数值.0,-1,1 0;猜中返回num -1:比猜测的数值小 1:比 ...
- python面向对象小练习
就是几个动物,自动排列生成什么的 class Animal(object): def __init__(self,name,weight): self.name = name self.weight ...