zoukankan      html  css  js  c++  java
  • Unity 反转法线,在 Hierarchy 视图对象的快捷菜单中增加 Flip Mesh Normals(反转网格法线)项

    以下.cs需要放置在名称为 Editor 的文件夹下
    EditorFlipMeshNormals.cs

    #if UNITY_EDITOR
    
    using UnityEditor;
    using UnityEngine;
    
    /// <summary>
    /// 在 Hierarchy 视图对象的快捷菜单中增加 Flip Mesh Normals(反转网格法线)项
    /// </summary>
    public class EditorFlipMeshNormals : Editor {
    
        /// <summary> 翻转网格的法线 </summary>
        private static void FlipMeshNormals (Mesh mesh) {
            int[] triangles = mesh.triangles;
            for (int i = 0, len = triangles.Length; i < len; i += 3) {
                // 交换三角形的首尾索引
                int t = triangles[i];
                triangles[i] = triangles[i + 2];
                triangles[i + 2] = t;
            }
            mesh.triangles = triangles;
    
        }
    
        /// <summary> 翻转多个游戏对象网格的法线 </summary>
        private static void FlipMeshNormals (GameObject[] gameObjects) {
            for (int i = 0, len = gameObjects.Length; i < len; i++) {
                GameObject go = gameObjects[i];
    
                Mesh mesh = null;
                SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
                if (skinnedMeshRenderer) {
                    mesh = skinnedMeshRenderer.sharedMesh;
                } else {
                    MeshFilter meshFilter = go.GetComponent<MeshFilter>();
                    if (meshFilter) {
                        mesh = meshFilter.sharedMesh;
                    }
                }
    
                if (mesh) {
                    string path = AssetDatabase.GetAssetPath(mesh);
                    // 是否为 Assets 文件夹下的资源(Assets 文件夹下的资源才能编辑,避免编辑到 Unity 的内置资源的网格)
                    bool isAssetFolder = path.IndexOf("Assets/") > -1;
                    if (isAssetFolder) {
                        FlipMeshNormals(mesh);
                    }
                }
            }
        }
    
        /// <summary> 验证所选择的游戏对象有网格时菜单才可用(不计算子级) </summary>
        [MenuItem("GameObject/Flip Mesh Normals", true)]
        private static bool ValidateFlipMeshNormalsOnGameObject () {
            bool isEnableMenuItem = false;
            GameObject[] gameObjects = Selection.gameObjects;
            for (int i = 0, len = gameObjects.Length; i < len; i++) {
                GameObject go = gameObjects[i];
                Mesh mesh = null;
                SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
                if (skinnedMeshRenderer) {
                    mesh = skinnedMeshRenderer.sharedMesh;
                } else {
                    MeshFilter meshFilter = go.GetComponent<MeshFilter>();
                    if (meshFilter) {
                        mesh = meshFilter.sharedMesh;
                    }
                }
    
                if (mesh) {
                    string path = AssetDatabase.GetAssetPath(mesh);
                    // 是否为 Assets 文件夹下的资源(Assets 文件夹下的资源才能编辑,避免编辑到 Unity 的内置资源的网格)
                    bool isAssetFolder = path.IndexOf("Assets/") > -1;
                    if (isAssetFolder) {
                        isEnableMenuItem = true;
                        break;
                    }
                }
            }
            return isEnableMenuItem;
        }
    
        [MenuItem("GameObject/Flip Mesh Normals", false, 11)]
        private static void FlipMeshNormalsOnGameObject () {
            FlipMeshNormals(Selection.gameObjects);
        }
    
    }
    #endif
    

  • 相关阅读:
    Source Insight小技巧:修改Symbol Window的默认宽度
    Source Insight小技巧:修改Symbol Window的默认宽度
    Source Insight小技巧:修改Symbol Window的默认宽度
    山村夫妻归乡创业,年纯收入达到10余万元
    农村小伙成立专业合作社,用行动证明回农村也可以有所作为
    python dir() 查看对象方法
    //div/a/@target 获取所有div下a标签的 target的值
    根据 htmlEmt.xpath('//a[@target="_blank"]') 根据a标签 查找target=_blank 的值
    python 根据a标签查找href的值
    解决 lxml报XMLSyntaxError: Opening and ending tag mismatch: meta line 14 and head, line 33, column 8
  • 原文地址:https://www.cnblogs.com/kingBook/p/15309169.html
Copyright © 2011-2022 走看看