zoukankan      html  css  js  c++  java
  • 分别改动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]; 
            }
        }
    }
    
    1. 使用的贴图
      这里写图片描写叙述

    2. 给一个Cube加入改图片材质。

      并加入CustomUVS.cs脚本。改动须要截取的区域原点
      这里写图片描写叙述

    注意:因为图片是3x3的。所以截取区域中按3等分截取。

    实际效果
    这里写图片描写叙述

  • 相关阅读:
    引用类型中的push()、pop()、shift()方法
    SQL Server ->>监控和管理Tempdb
    SQL Server ->> 与SQL Server服务配置相关的DMV
    SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)
    SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Row-Level Security(行级别安全控制)
    SQL Server ->> SQL Server 2016新特性之 -- sp_set_session_context存储过程和SESSION_CONTEXT函数
    SQL Server ->> Enable Instant File Initialization(开启文件及时初始化)
    SQL Server ->> 尝试优化ETL中优化Merge性能
    SQL Server ->> 校检函数CHECKSUM、CHECKSUM_AGG、BINARY_CHECKSUM和HASHBYTES
    SQL Server ->> Database Promgramming Object Security Control(数据库编程对象安全控制)
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7050643.html
Copyright © 2011-2022 走看看