1. 程式人生 > >[Unity實戰]自定義mesh

[Unity實戰]自定義mesh

參考連結:http://blog.csdn.net/zuoyamin/article/details/9287507

對於自定義mesh,有三點很重要:

1.頂點個數=三角形數+2;三角形頂點數=3*三角形數

2.頂點建立的順序最好是順時針或者逆時針建立的,這樣可以大大地減少演算法的複雜度

3.頂點繪製的順序必須是順時針或者逆時針繪製的,這樣才能正確地繪製以頂點為邊界點的圖形,頂點繪製的順序參考mesh.triangles

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CustomMesh : MonoBehaviour {

}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;

//使用前最好先鎖定Inspector面板!
[CustomEditor(typeof(CustomMesh))]  
public class CustomMeshEditor : Editor {

    private List<Vector3> vertices = new List<Vector3>();
    private int[] triangles;

    void OnSceneGUI()
    {
        CustomMesh customMesh = (CustomMesh)target;

        for (int i = 0; i < vertices.Count; i++)
        {
            Handles.PositionHandle(vertices[i], Quaternion.identity);
            Handles.Label(vertices[i], i.ToString());
        }
        if (vertices.Count > 1)
        {
            Handles.DrawPolyLine(vertices.ToArray());
            Handles.DrawLine(vertices[vertices.Count - 1], vertices[0]);
        }     

        //在OnSceneGUI()中只能通過Handles來繪製新檢視
        //如果你想引入GUI的元素哪麼就需要使用BeginGUI()和EndGUI()組合的使用。  
        Handles.BeginGUI();
        GUILayout.BeginArea(new Rect(0, 0, 100, 100));
 
        if (GUILayout.Button("建立點"))
        {
            vertices.Add(customMesh.transform.position);          
        }
        if (GUILayout.Button("撤銷點"))
        {
            vertices.RemoveAt(vertices.Count - 1);
        }
        if (GUILayout.Button("匯出mesh"))
        {
            Mesh mesh = new Mesh();
            
            int triangleAmount = vertices.Count - 2;
            triangles = new int[3 * triangleAmount];

            //根據三角形的個數,來計算繪製三角形的頂點順序(索引)
            //順序必須為順時針或者逆時針
            for (int i = 0; i < triangleAmount; i++)
            {
                triangles[3 * i] = 0;//固定第一個點
                triangles[3 * i + 1] = i + 1;
                triangles[3 * i + 2] = i + 2;
            }

            mesh.vertices = vertices.ToArray();
            mesh.triangles = triangles;

            AssetDatabase.CreateAsset(mesh, "Assets/CustomMesh.asset");
        }
        GUILayout.EndArea();
        Handles.EndGUI();   
    }
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

例項(屬性圖的製作):



using UnityEngine;
using System.Collections.Generic;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]  
public class CreatePentagon : MonoBehaviour {

    public Transform[] verticesTra;//賦值順序為順時針或者逆時針
    public float[] proportion;//比例

    void Start()
    {
        List<Vector3> vertices = new List<Vector3>();
        for (int i = 0; i < verticesTra.Length; i++)
        {
            Vector3 pos = (verticesTra[i].position - transform.position) * proportion[i];
            vertices.Add(pos);
        }

        DrawPentagon(vertices);
    }

    void DrawPentagon(List<Vector3> vertices)
    {
        Mesh mesh = new Mesh();
        int triangleAmount = vertices.Count - 2;
        int[] triangles = new int[3 * triangleAmount];

        //根據三角形的個數,來計算繪製三角形的頂點順序(索引)  
        //順序必須為順時針或者逆時針  
        for (int i = 0; i < triangleAmount; i++)
        {
            triangles[3 * i] = 0;//固定第一個點  
            triangles[3 * i + 1] = i + 1;
            triangles[3 * i + 2] = i + 2;
        }

        mesh.vertices = vertices.ToArray();
        mesh.triangles = triangles;

        GetComponent<MeshFilter>().mesh = mesh;
    }
}

相關推薦

[Unity實戰]定義mesh

參考連結:http://blog.csdn.net/zuoyamin/article/details/9287507 對於自定義mesh,有三點很重要: 1.頂點個數=三角形數+2;三角形頂點數=3*三角形數 2.頂點建立的順序最好是順時針或者逆時針建立的,這樣可以大大地

Unity NGUI UIPanel下對粒子或定義Mesh的剪裁

ngui unity uipanel 裁切 剪裁 粒子 寫在開篇: 越來越煩那些無腦轉發自己不做驗證的博主論壇樓主,網上好不容易找到一些資料,結果代碼搞下來卻是錯的,有些確實是因為版本問題太老不兼容,但是有些明顯是有問題的,轉發前自己試試就知道肯定是不能用的。結果。。。哎。。。真

關於Unity實現定義多邊形圖片效果

image 物體 length inspector 設置 this err eve mes 關於Unity實現自定義多邊形圖片效果 1.創建RawImageEditor編輯器拓展腳本(放在工程中Editor文件夾下,沒有則創建) 1 /*****************

Unity C# 定義TCP傳輸協議以及封包拆包、解決粘包問題(網路應用層協議)

本文只是初步實現了一個簡單的基於TCP的自定協議,更為複雜的協議可以根據這種方式去擴充套件。 網路應用層協議,通俗一點的講,它是一種基於socket傳輸的由傳送方和接收方事先協商好的一種訊息包組成結構,主要由訊息頭和訊息體組成。  眾所周知,基於socket的資訊互動有兩

一、Unity Editor定義選單

官方文件:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items 1、選單欄選單 [MenuItem("選單名稱")] public static v

unity webgl定義啟動進度條動畫

多多少少在unity官網webgl模板看到了Template自定義介紹,今天分享一個超級實用的 新增自定義的模板有兩種方式: 1.在你-----unity安裝位置\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\We

[引擎]之三:在Unity定義CubeMesh

之前的文章mesh在Unity中的簡單使用說過,會建立CubeMesh。嗯,來了。 之前已經知道如何建立一個簡單的片mesh,那麼同理,CubeMesh的建立,同樣是從頂點、三角面、uv座標三個方面生成。 (1) 頂點的生成 一個cube只需要8個頂

Ionic 3 專案實戰------定義外掛

一個外掛應該至少包含以下file: plugin-name -----------------src                                 //外掛支援平臺 ------android.java      //添加了支援Android平臺 ---

Unity定義過場動畫Splash Image

iOS How do I make a splash screen? 如何製作啟動畫面? As part of your game publishing process, you may want to customize the splash screen that appears when launch

android retrofit 實戰定義converter,解決相同介面返回不同資料的問題

square的retrofit是目前比較火的網路框架,我目前也在用 今天專案上遇到一個問題,就是請求同一個介面,可能返回不同的json格式 例如,訪問一個登入介面,成功的時候,返回的是 {     "code": 0,     "message": "登入成功",    

Unity Shader 定義SurfaceShader

這裡只做記錄用,不進行詳細的講解。 Shader "Custom/SurfaceShader" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) =

stream外掛跨域大檔案斷點續傳實戰+定義限速

JAVA跨域大檔案斷點續傳+自定義限速 前言:本文所講到的內容完全獨創,遇坑很多,但是本著資源共享的原則,將兩個星期的成果分享給大家,請尊重別人的勞動成果,轉載請註明出處:http://blog.c

Unity釋出定義解析度程式

在windows上,找到這個registry key:HKEY_CURRENT_USER\Software\[company name]\[product name],刪除整個目錄,然後重新構建,執行程式 對應的找到在Mac中~/Library/Preferences/unity 的目錄下刪除對應的pref

修改模型的網格資料(定義Mesh

內容會持續更新,有錯誤的地方歡迎指正,謝謝! 有時,需要自定義mesh來繪製模型或圖形,可以程式碼控制,也可以shader控制,這裡介紹程式碼控制的方法: 何為Mesh Mesh是模型的網格,一個3D模型的表面是由多個彼此相連的三角面構成。三維空間中,構成這些三

unity定義彈出框

一、彈出框的搭建: 佈局如圖:Message為整個父物體,並且新增UiMessage程式碼。panel為遮罩。 MessageBox為整個提示框,Panel為標題,ok為確定按鈕,cancel為取消按鈕,retry為重試按鈕,Text為提示框的文字。 注意大小寫,後面程式碼會根據名稱進行獲取對應組建。 &nb

Hadoop實戰-Flume之定義Sink(十九)

current ioe back urn oop print out java try import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream;

實戰案例:構建docker容器集群 (解決方案一:使用定義網橋連接跨主機容器)

docker一、實驗環境虛擬機a兩塊網卡 eth0 eth1 (IP地址static或者dhcp)虛擬機b兩塊網卡 eth0 eth1 (IP地址static或者dhcp)二、在兩臺虛擬機上配置網橋虛擬機a操作:apt-get install bridge-utilsvim /etc/ne

Unity定義編譯器窗口查找腳本

item arc cti 大型項目 ans using add dsc nts 在中大型項目中腳本繁多,子物體繁多,想要找到自己的腳本都掛到哪裏,尤其是剛剛接手別人的項目,這是一件令人頭疼的事。下面貼出一個小功能方便大家使用。腳本不復雜,不過卻帶來方便 註:下面的兩個腳本需

Zabbix(六):項目實戰之--自動發現nginx調度器及後端web服務集群、定義參數監控

zabbix 自動發現 nginx項目: 1.自動發現nginx調度器及後端apache構建的web服務集群; 2.使用自定義參數監控調度器上nginx服務的相關統計數據及速率數據; 3.使用自定義參數監控後端apache服務的相關統計數據及速率數據;(選做) 4.制定出nginx調度器及後端apache服務

Unity 定義Editor菜單快捷鍵

ini 快捷鍵 stat windows ctr 快捷 unity 光標 conf 1.快捷鍵 %-CTRL 在Windows / CMD在OSX # -Shift & -Alt LEFT/RIGHT/UP/DOWN-光標鍵 F1…F12 HOME,END,PGU