• 分别改动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等分截取。

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

  • 相关阅读:
    Java基础课程---将一个字符串反转,将字符串中指定部分进行反转,比如,"abcdefg", 反转为"abfedcg"
    在Centon64位中卸载安装时系统自带的--openjdk,并且安装自己需要的jdk
    Java基础课程---sleep()方法 和 wait()方法的异同(面试题)
    Java基础课程---权限修饰符
    Java基础课程---
    MySQL 创建库
    brew
    android webview load 本地文件需要注意的地方
    android下隐藏标题栏
    android webview无法加载网页
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7050643.html
Copyright © 2020-2023  润新知