精华内容
参与话题
问答
  • unity3d构建mesh 欢迎来到这个由三部分组成的关于Unity 3D的博客系列的最后一篇文章。... 在本系列的最后一篇文章中,我们将深入研究如何使用Unity3D将代码实际制作成一个简单的游戏。 让我们开始吧 让我们建...

    unity3d构建mesh

    欢迎来到这个由三部分组成的关于Unity 3D的博客系列的最后一篇文章。 在本系列中,我们将在Unity3D中使用丰富的控件创建一个简单的3D游戏。 第一部分介绍了如何设置Unity3D ,第二部分介绍了如何 使用C#控制Unity3D

    在本系列的最后一篇文章中,我们将深入研究如何使用Unity3D将代码实际制作成一个简单的游戏。

    让我们开始吧

    让我们建立一些关卡,进行更多类似游戏的动作和最终目标。

    首先,让我们添加一些要坚持的世界墙。 为此,我们将添加一堆多维数据集,并使用以前的实践来将它们缩放和定位。

    让我们转到Unity编辑器中的“场景视图”。 单击“层次结构视图”(未选择任何内容)并创建另一个空对象。 清除其变换(0,0,0)并将该对象命名为“世界”。

    Unity3D.3.1

    然后,我们要清除一些不再需要的旧对象。 让我们删除为测试添加的白色立方体和球体。

    Unity3D.3.11

    现在选择了“ World对象”,让我们添加一个多维数据集。 然后,将其位置和比例尺值更改为相等的位置0、2.5、0和比例尺10、5、1。这将使我们的墙长10个单位,高5个单位,宽1个单位。

    Unity3D.3.12

    现在,让我们的场景相机定位为具有自顶向下的视图。 单击“场景视图”右上角的绿色Y。

    Unity3D.3.13

    Unity3D.3.14

    现在将墙旋转90度并将位置设置为-5、2.5、5。

    Unity3D.3.15

    然后让我们添加一堵墙的副本。 右键单击它,复制,然后将其X位置设置为5。

    Unity3D.3.16

    选择我们拥有的两堵墙,然后再次复制它们。 选中这两个选项后,让它们的Z位置值为15。

    Unity3D.3.17
    仍然选择它们,再次复制,并将它们移到Z位置25和X位置-10。

    接下来,我们将使用一个新工具将它们一起旋转。 在右上角有一组5个按钮。 我们将选择中间按钮,然后将Y旋转设置为0。

    Unity3D.3.18

    Unity3D.3.19

    然后,我们将选择Wall(4)将其比例尺X比例尺30设为更长。

    Unity3D.3.20

    然后选择Wall(2)并将其比例X也设置为30。

    Unity3D.3.21

    然后选择Wall和Wall(3),复制它们,并将复制品设置为X位置-15。

    Unity3D.3.22

    然后选择Wall(2),复制它,并将其X位置设置为-25。

    Unity3D.3.23

    现在,使我们的速度与本课程更加友好。

    在“层次结构视图”中选择“ Player对象,然后在检查器编辑器中编辑值“前进速度”和“旋转速度”。 我喜欢5代表前进,50代表转向。

    Unity3D.3.24

    现在让我们为游戏添加一个目标。 让我们添加一个具有碰撞器的区域,该碰撞器在越过终点线时触发。

    首先让我们添加完成区域。 我们将使用另一个多维数据集来设置边界。 在没有选择任何内容的层次结构视图中,通过右键单击3D对象->多维数据集添加多维数据集。 我们将其命名为Finish,将其位置设置为-10、2.5、15,并将其比例设置为5、5、5。

    Unity3D.3.25
    接下来,让我们给它新的材料。 在“资源”窗口中右键单击,然后单击创建->材质。 让我们将其Albedo设置为00B6006B,然后将其渲染模式更改为“透明”。 这使其绘制透明。

    Unity3D.3.26

    然后,我们需要编辑Finish Cube Collider 而不是添加到物理上,我们希望它禁用碰撞并仅触发。 为此,我们选择Finish对象,然后在Box Collider下的Inspector中,选中“ Is Trigger”。 这将使引擎触发OnTrigger方法。

    Unity3D.3.27

    然后让我们将脚本添加到Finish对象,以控制完成后会发生什么。 我们将其FinishController ,然后在MonoDevelop FinishController其打开。 然后,我们添加一个新函数,然后在输入对象时进行记录。

    void OnTriggerEnter(Collider collider){
    	Debug.Log( “Finished” );
    }

    Unity3D.3.28

    现在按播放。 我们应该能够环游世界并找到Finish立方体。 进入多维数据集后,我们应该能够打开控制台窗口并看到消息“ Finished”。

    Unity3D.3.29

    Unity3D.3.30

    现在,将其设置为在显示屏上显示一条消息以向用户显示,而不是仅记录该消息。 我们将说他们完成了游戏,然后添加了一个按钮以重新启动游戏。

    首先,我们需要将一个Text对象添加到我们的世界中。 转到“层次结构视图”,单击鼠标右键,然后单击“ UI =>文本”。 这将为我们的场景添加三件事:一是应在摄像机视口中显示的文本对象,二是Canvas(即GUI后面的设置和层次结构),三是EventSystem ,该事件系统可以引发和捕获事件GUI就像拖放一样。

    Unity3D.3.31

    在“场景视图”中很难处理文本,因此让我们切换到“游戏视图”。

    Unity3D.3.32

    现在,我们应该可以在右下角看到“新文本”字段。 让我们在层次结构视图中选择Text对象。 在检查器中,我们可以编辑文本。 将其位置设置为0、0、0,将宽度设置为500,将高度设置为500。将“文本”设置为“ You Finished”,格式为粗体,字体大小为80,颜色为红色。

    Unity3D.3.33

    现在,让我们打开FinishedController Script并添加一些代码。 我们首先需要能够访问UI库。 因此,在脚本的顶部,我们需要使用UnityEngine.UI进行添加,然后添加一个public Text finishedText UnityEngine.UI ,以便可以访问我们的text元素。

    Unity3D.3.34

    现在回到编辑器。 让我们单击“完成”多维数据集对象,然后将“文本”对象拖到脚本的“完成文本”字段中。

    Unity3D.3.35

    现在,我们可以访问text元素。 要设置我们的文本,让我们在FinishedController > Start function finishedText.text = “”编写; 从某种意义上讲,这将在我们运行游戏时通过将文本保留为空白来隐藏文本。

    Unity3D.3.36

    现在,让我们OnTriggerEnter函数,并添加代码以在文本中写上“ You Finished”。

    Unity3D.3.37

    现在按播放。 我们应该看到文本在游戏开始时就消失了。 一旦找到饰面并跨入多维数据集,它将为您提供完成的文本。

    Unity3D.3.38

    Unity3D.3.39

    现在让我们做与文本相同的操作,但是这次添加一个按钮。 选择按钮,然后在检查器中,更改文本以重新启动游戏。 让我们将其保留在默认位置。

    Unity3D.3.40

    现在,让我们转到FinishController并添加另一个公共UI元素public button restartButton

    Unity3D.3.41

    然后返回到“完成”对象的检查器。 让我们将按钮拖动到restartbutton

    Unity3D.3.42

    让我们在启动函数中添加一些代码。 我们将希望隐藏代码,以使我们无法一直看到它,还需要重置一些代码。 首先,我们可以添加restartButton.gameObject.SetActive(false)隐藏,这将隐藏游戏对象。 然后在OnTriggerEnter我们需要使用restartButton.gameObject.SetActive(true);将其反转restartButton.gameObject.SetActive(true);

    Unity3D.3.43

    然后在FinishController ,添加一个名为RestartGame()的公共void函数。 这将是我们在按钮on click控制器中调用的函数。 同样在函数中,让我们添加代码以在按下场景时重新加载场景,使用UnityEngine.SceneManagement;在文件顶部添加另一个using语句UnityEngine.SceneManagement; 然后,将代码添加到RestartGame Function SceneManager.LoadScene(“Main Scene”); 它必须是您在字符串中调用的场景,否则它将更改您的场景,而不是重新加载它( Main.Scene )。

    Unity3D.3.44

    现在,我们可以转到“层次结构视图”并选择“按钮”对象。 在检查器中,底部有一个On Click Controller ”。 我们只想单击+号并添加一个新的运行时。 然后,将Finish游戏对象拖到下拉列表中,单击no函数,然后选择FinishController => RestartGame

    Unity3D.3.45

    Unity3D.3.46

    现在玩吧。

    您现在应该可以玩到游戏结束。 触发完成后,您应该会收到消息“您已完成”和“重新启动游戏”按钮。 如果您单击“重新启动游戏”按钮,它应该允许您再次播放。

    Unity3D.3.47

    结语

    结束!

    现在,您应该能够在带有丰富控件的Unity3D中创建一个简单的3D游戏或应用程序。 请留下您的任何评论或问题。 谢谢阅读!

    翻译自: https://www.javacodegeeks.com/2016/08/building-3d-simulations-unity3d.html

    unity3d构建mesh

    展开全文
  • <Unity3D>Unity3DMeshRenderer的使用

    万次阅读 2014-05-02 00:03:08
    操作环境:Win7操作系统、Unity3D 4.0 创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。 添加组件的方法有2种: (Ⅰ)选择一个游戏对象,然后执行Component...
    
    

    任何一个模型都是由许多网格面组成的,而面又是由许多三角形组成的。

    操作环境:Win7操作系统、Unity3D 4.0

    创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。

    添加组件的方法有2种:

    (Ⅰ)选择一个游戏对象,然后执行Component→Mesh→Mesh Filter 和Mesh Renderer。

     

    (Ⅱ)通过脚本实现:

    [csharp] view plaincopy
    1. //添加MeshFilter  
    2. gameObject.AddComponent<MeshFilter>();  
    3. //添加MeshRenderer  
    4. gameObject.AddComponent<MeshRenderer>();  
    5. //获得Mesh  
    6. mesh = GetComponent<MeshFilter>().mesh;  

     

    【理论分析】

    由于网格面是由三角形组成的,所以我们有必要知道三角的三个顶点的位置。数组mesh.vertices就是用于存储三角形顶点坐标。

    当顶点数超过3个的时候,我们连接点的顺序不同,就会绘制出不同形状的图形,所以我们必须要获得我们想要的连接点的顺序。数组mesh.triangles就是用来记录连接三角形的顺序的。由于每绘制一个三角形需要知道其三个顶点的顺序,那么绘制n个三角形就需要知道3*n个点的顺序。即数组mesh.triangles的长度是3的倍数。

    如上图,如果我们已知顶点的坐标和顺序如上,怎样绘制出这样的图形?

    已知5个点,选择3个点来连接,将其全部连接完有很多种方式,这里我就不计算了~嘻嘻嘻。但是不是每一种方式都能连接成上面的图形的。例如:(0,1,2),(1,2,3),(2,3,4)就无法完成上面的图形。所以我们必须要获得三角形顶点的索引顺序。完成上面图形我采用的顺序:(0,1,2),(0,2,3),(0,3,4)。大家也可以使用其他的顺序。那么我的mesh.triangles=new int[]{0,1,2,0,2,3,0,3,4};而mesh.vertices的值就是点的坐标了。

     

     【案例】拖动鼠标来绘制一个圆弧

    [csharp] view plaincopy
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using System.Collections.Generic;  
    4.   
    5. public class MeshTest : MonoBehaviour {  
    6.   
    7.     //用于存储绘制三角形的顶点坐标  
    8.     private Vector3[] vertices;  
    9.     //用于记录绘制三角形所需要的顶点ID顺序  
    10.     private int[] triangles;  
    11.     //记录顶点数  
    12.     private int count=0;  
    13.     //定义Mesh  
    14.     private Mesh mesh;  
    15.     //定义一个链表用于记录所有点的坐标  
    16.     private List<Vector3> list;  
    17.   
    18.     void Start () {  
    19.   
    20.         //添加MeshFilter  
    21.         gameObject.AddComponent<MeshFilter>();  
    22.         //添加MeshRenderer  
    23.         gameObject.AddComponent<MeshRenderer>();  
    24.         //new一个链表  
    25.         list = new List<Vector3>();  
    26.         //获得Mesh  
    27.         mesh = GetComponent<MeshFilter>().mesh;  
    28.         //修改Mesh的颜色  
    29.         GetComponent<MeshRenderer>().material.color =Color.green;  
    30.         //选择Mesh中的Shader  
    31.         GetComponent<MeshRenderer>().material.shader = Shader.Find("Transparent/Diffuse");  
    32.         //清空所有点,用于初始化!  
    33.         mesh.Clear();         
    34.           
    35.       
    36.     }  
    37.       
    38.       
    39.     void Update () {  
    40.   
    41.         //点击鼠标左键  
    42.         if (Input.GetMouseButton(0))  
    43.         {      
    44.             //顶点数+1  
    45.             count++;  
    46.             //将获得的鼠标坐标转换为世界坐标,然后添加到list链表中。  
    47.             list.Add(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.8f)));  
    48.               
    49.         }  
    50.   
    51.         //如果顶点数>=3,那么就开始渲染Mesh  
    52.         if (count >= 3)  
    53.         {  
    54.             //根据顶点数来计算绘制出三角形的所以顶点数  
    55.             triangles = new int[3 * (count - 2)];  
    56.             //根据顶点数来创建记录顶点坐标  
    57.             vertices = new Vector3[count];  
    58.             //将链表中的顶点坐标赋值给vertices  
    59.             for (int i = 0; i < count; i++)  
    60.             {  
    61.                 vertices[i] = list[i];  
    62.   
    63.             }  
    64.   
    65.             //三角形个数  
    66.             int triangles_count = count - 2;  
    67.             //根据三角形的个数,来计算绘制三角形的顶点顺序(索引)  
    68.             for (int i = 0; i < triangles_count; i++)  
    69.             {  
    70.                 //这个算法好好琢磨一下吧~  
    71.                 triangles[3 * i] = 0;  
    72.                 triangles[3 * i + 1] = i + 2;  
    73.                 triangles[3 * i + 2] = i + 1;  
    74.             }  
    75.             //设置顶点坐标  
    76.             mesh.vertices = vertices;  
    77.             //设置顶点索引  
    78.             mesh.triangles = triangles;  
    79.         }  
    80.       
    81.     }  
    82. }  

    【效果图】

    展开全文
  • unity3D使用mesh画圆柱面

    千次阅读 2019-04-17 09:18:31
    尽管unity3D中直接有模块画圆柱体,但画圆面仍旧需要自己使用mesh来绘制。使用mesh画图一般分为四个步骤。 1.顶点 2.三角形 3.UV 4.负载属性与mesh 自己绘制一个简单的平面代码如下: Mesh Createmeshp(float...

    尽管unity3D中直接有模块画圆柱体,但画圆面仍旧需要自己使用mesh来绘制。使用mesh画图一般分为四个步骤。

    1.顶点

    2.三角形

    3.UV

    4.负载属性与mesh

    自己绘制一个简单的平面代码如下:

    Mesh Createmeshp(float radius, float Height)
        {
            //vertices:
            int p_vertices_count = 4;
            Vector3[] p_vertices = new Vector3[p_vertices_count];
            p_vertices[0] = new Vector3(-radius, -Height / 2, radius);
            p_vertices[1] = new Vector3(-radius, Height / 2, radius);
            p_vertices[2] = new Vector3(radius, -Height / 2, radius);
            p_vertices[3] = new Vector3(radius, Height / 2, radius);
    
            //triangles
    
            int[] p_triangles = new int[6];
    
            p_triangles[0] = 0;
            p_triangles[1] = 1;
            p_triangles[2] = 2;
    
            p_triangles[3] = 3;
            p_triangles[4] = 2;
            p_triangles[5] = 1;
    
            //uv:
            Vector2[] p_uvs = new Vector2[4];
            float p_uvSetup = 1.0f ;
    
     
            p_uvs[0] = new Vector2(p_uvSetup * 0, 1);
            p_uvs[1] = new Vector2(p_uvSetup * 0, 0);
            p_uvs[2] = new Vector2(p_uvSetup * 1, 1);
            p_uvs[3] = new Vector2(p_uvSetup * 1, 0);
    
    
            //负载属性与mesh
            Mesh mesh = new Mesh();
            mesh.vertices = p_vertices;
            mesh.triangles = p_triangles;
            mesh.uv = p_uvs;
            return mesh;
        }

     绘制结果如下图所示:

     

     

    而圆柱面和平面最大的区别就是面是首尾相连的,所以在画三角形时应该分别考虑连续的部分和首尾相连的部分,比如考虑由四个平面组成的首尾相连的长方体侧面,他们可以按如下代码绘制:

     Mesh Createmesh(float radius, float Height)
        {
            int s_vertices_count = 8;
            Vector3[] s_vertices = new Vector3[s_vertices_count];
            s_vertices[0] = new Vector3(-radius, -Height / 2, -radius);
            s_vertices[1] = new Vector3(-radius, Height / 2, -radius);
            s_vertices[2] = new Vector3(-radius, -Height / 2, radius);
            s_vertices[3] = new Vector3(-radius, Height / 2, radius);
            s_vertices[4] = new Vector3(radius, -Height / 2, radius);
            s_vertices[5] = new Vector3(radius, Height / 2, radius);
            s_vertices[6] = new Vector3(radius, -Height / 2, -radius);
            s_vertices[7] = new Vector3(radius, Height / 2, -radius);
            //triangles
            int tri_num = 8;
            int tri_cout = tri_num * 3;
            int[] s_triangles = new int[tri_cout];
            for (int i = 0, vi = 0; i < tri_cout - 6; i += 6, vi += 2)
            {
                s_triangles[i] = vi;
                s_triangles[i + 1] = vi + 1;
                s_triangles[i + 2] = vi + 2;
    
                s_triangles[i + 3] = vi + 3;
                s_triangles[i + 4] = vi + 2;
                s_triangles[i + 5] = vi + 1;
            }
            s_triangles[tri_cout - 6] = 6;
            s_triangles[tri_cout - 5] = 7;
            s_triangles[tri_cout - 4] = 0;
    
            s_triangles[tri_cout - 3] = 1;
            s_triangles[tri_cout - 2] = 0;
            s_triangles[tri_cout - 1] = 7;
    
            //uv:
            Vector2[] s_uvs = new Vector2[s_vertices_count];
            float s_uvSetup = 1.0f / 4;
            int iduv = 0;
            for (int i = 0; i < s_vertices_count; i = i + 2)
            {
                s_uvs[i] = new Vector2(s_uvSetup * iduv, 1);
                s_uvs[i + 1] = new Vector2(s_uvSetup * iduv, 0);
                iduv++;
            }
    
            //负载属性与mesh
            Mesh mesh = new Mesh();
            mesh.vertices = s_vertices;
            mesh.triangles = s_triangles;
            mesh.uv = s_uvs;
            return mesh;
        }

    结果显示如下:

     由于圆柱面地面是个圆,还得需要按照一定的规律来计算圆周上的各点

     Mesh CreateMesh(float radius, int segments, float Height)
        {
            //vertices:
            int vertices_count = Segments * 2;
            Vector3[] vertices = new Vector3[vertices_count];
            //vertices[0] = Vector3.zero;
            float angledegree = 360.0f;
            float angleRad = Mathf.Deg2Rad * angledegree;
            float angleCur = angleRad;
            float angledelta = angleRad / Segments;
            for (int i = 0; i < vertices_count; i++)
            {
                float cosA = Mathf.Cos(angleCur);
                float sinA = Mathf.Sin(angleCur);
    
                vertices[i] = new Vector3(Radius * cosA, Height / 2, Radius * sinA);
                i++;
                vertices[i] = new Vector3(Radius * cosA, -Height / 2, Radius * sinA);
                angleCur -= angledelta;
            }
    
            //triangles
            int triangle_count = segments * 3 * 2;
            int[] triangles = new int[triangle_count];
            int vert = 0;
            int idx = 0;
            for (int i = 0; i < segments - 1; i++)     //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理
            {
                triangles[idx++] = vert + 1;
                triangles[idx++] = vert;
                triangles[idx++] = vert + 3;
    
                triangles[idx++] = vert;
                triangles[idx++] = vert + 2;
                triangles[idx++] = vert + 3;
                vert += 2;
            }
            triangles[triangle_count - 6] = vertices_count - 1;
            triangles[triangle_count - 5] = vertices_count - 2;
            triangles[triangle_count - 4] = 1;
            triangles[triangle_count - 3] = vertices_count - 2;
            triangles[triangle_count - 2] = 0;
            triangles[triangle_count - 1] = 1;                           //为了完成闭环,将最后一个三角形单独拎出来
    
            //uv:
            Vector2[] uvs = new Vector2[vertices_count];
            float uvSetup = 1.0f / Segments;
            int iduv = 0;
            for (int i = 0; i < vertices_count; i = i + 2)
            {
                uvs[i] = new Vector2(uvSetup * iduv, 1);
                uvs[i + 1] = new Vector2(uvSetup * iduv, 0);
                iduv++;
            }
    
            //负载属性与mesh
            Mesh mesh = new Mesh();
            mesh.vertices = vertices;
            mesh.triangles = triangles;
            mesh.uv = uvs;
            return mesh;
        }

     结果如下:

    侧面

     

     俯视

     

     附整体代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour
    {
    
        public float Radius = 10f;    //半径  
        public int Segments = 600;   //分割数  
        public float Height = 2;           ///3.1415926f;
        private MeshFilter meshFilter;
    
    
        void Start()
        {
            //Debug.Log("hello unity: ");
            meshFilter = GetComponent<MeshFilter>();
            //圆柱,长方体,平面
            meshFilter.mesh = CreateMesh(Radius, Segments,Height);
            //meshFilter.mesh = Createmesh(Radius,  Height);
            //meshFilter.mesh = Createmeshp(Radius, Height);
    
        }
    
        Mesh CreateMesh(float radius, int segments, float Height)
        {
            //vertices:
            int vertices_count = Segments * 2;
            Vector3[] vertices = new Vector3[vertices_count];
            //vertices[0] = Vector3.zero;
            float angledegree = 360.0f;
            float angleRad = Mathf.Deg2Rad * angledegree;
            float angleCur = angleRad;
            float angledelta = angleRad / Segments;
            for (int i = 0; i < vertices_count; i++)
            {
                float cosA = Mathf.Cos(angleCur);
                float sinA = Mathf.Sin(angleCur);
    
                vertices[i] = new Vector3(Radius * cosA, Height / 2, Radius * sinA);
                i++;
                vertices[i] = new Vector3(Radius * cosA, -Height / 2, Radius * sinA);
                angleCur -= angledelta;
            }
    
            //triangles
            int triangle_count = segments * 3 * 2;
            int[] triangles = new int[triangle_count];
            int vert = 0;
            int idx = 0;
            for (int i = 0; i < segments - 1; i++)     //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理
            {
                triangles[idx++] = vert + 1;
                triangles[idx++] = vert;
                triangles[idx++] = vert + 3;
    
                triangles[idx++] = vert;
                triangles[idx++] = vert + 2;
                triangles[idx++] = vert + 3;
                vert += 2;
            }
            triangles[triangle_count - 6] = vertices_count - 1;
            triangles[triangle_count - 5] = vertices_count - 2;
            triangles[triangle_count - 4] = 1;
            triangles[triangle_count - 3] = vertices_count - 2;
            triangles[triangle_count - 2] = 0;
            triangles[triangle_count - 1] = 1;                           //为了完成闭环,将最后一个三角形单独拎出来
    
            //uv:
            Vector2[] uvs = new Vector2[vertices_count];
            float uvSetup = 1.0f / Segments;
            int iduv = 0;
            for (int i = 0; i < vertices_count; i = i + 2)
            {
                uvs[i] = new Vector2(uvSetup * iduv, 1);
                uvs[i + 1] = new Vector2(uvSetup * iduv, 0);
                iduv++;
            }
    
            //负载属性与mesh
            Mesh mesh = new Mesh();
            mesh.vertices = vertices;
            mesh.triangles = triangles;
            mesh.uv = uvs;
            return mesh;
        }
        Mesh Createmesh(float radius, float Height)
        {
            int s_vertices_count = 8;
            Vector3[] s_vertices = new Vector3[s_vertices_count];
            s_vertices[0] = new Vector3(-radius, -Height / 2, -radius);
            s_vertices[1] = new Vector3(-radius, Height / 2, -radius);
            s_vertices[2] = new Vector3(-radius, -Height / 2, radius);
            s_vertices[3] = new Vector3(-radius, Height / 2, radius);
            s_vertices[4] = new Vector3(radius, -Height / 2, radius);
            s_vertices[5] = new Vector3(radius, Height / 2, radius);
            s_vertices[6] = new Vector3(radius, -Height / 2, -radius);
            s_vertices[7] = new Vector3(radius, Height / 2, -radius);
            //triangles
            int tri_num = 8;
            int tri_cout = tri_num * 3;
            int[] s_triangles = new int[tri_cout];
            for (int i = 0, vi = 0; i < tri_cout - 6; i += 6, vi += 2)
            {
                s_triangles[i] = vi;
                s_triangles[i + 1] = vi + 1;
                s_triangles[i + 2] = vi + 2;
    
                s_triangles[i + 3] = vi + 3;
                s_triangles[i + 4] = vi + 2;
                s_triangles[i + 5] = vi + 1;
            }
            s_triangles[tri_cout - 6] = 6;
            s_triangles[tri_cout - 5] = 7;
            s_triangles[tri_cout - 4] = 0;
    
            s_triangles[tri_cout - 3] = 1;
            s_triangles[tri_cout - 2] = 0;
            s_triangles[tri_cout - 1] = 7;
    
            //uv:
            Vector2[] s_uvs = new Vector2[s_vertices_count];
            float s_uvSetup = 1.0f / 4;
            int iduv = 0;
            for (int i = 0; i < s_vertices_count; i = i + 2)
            {
                s_uvs[i] = new Vector2(s_uvSetup * iduv, 1);
                s_uvs[i + 1] = new Vector2(s_uvSetup * iduv, 0);
                iduv++;
            }
    
            //负载属性与mesh
            Mesh mesh = new Mesh();
            mesh.vertices = s_vertices;
            mesh.triangles = s_triangles;
            mesh.uv = s_uvs;
            return mesh;
        }
        Mesh Createmeshp(float radius, float Height)
        {
            int p_vertices_count = 4;
            Vector3[] p_vertices = new Vector3[p_vertices_count];
            p_vertices[0] = new Vector3(-radius, -Height / 2, radius);
            p_vertices[1] = new Vector3(-radius, Height / 2, radius);
            p_vertices[2] = new Vector3(radius, -Height / 2, radius);
            p_vertices[3] = new Vector3(radius, Height / 2, radius);
    
            //triangles
    
            int[] p_triangles = new int[6];
    
            p_triangles[0] = 0;
            p_triangles[1] = 1;
            p_triangles[2] = 2;
    
            p_triangles[3] = 3;
            p_triangles[4] = 2;
            p_triangles[5] = 1;
    
            //uv:
            Vector2[] p_uvs = new Vector2[4];
            float p_uvSetup = 1.0f ;
    
     
            p_uvs[0] = new Vector2(p_uvSetup * 0, 1);
            p_uvs[1] = new Vector2(p_uvSetup * 0, 0);
            p_uvs[2] = new Vector2(p_uvSetup * 1, 1);
            p_uvs[3] = new Vector2(p_uvSetup * 1, 0);
    
    
            //负载属性与mesh
            Mesh mesh = new Mesh();
            mesh.vertices = p_vertices;
            mesh.triangles = p_triangles;
            mesh.uv = p_uvs;
            return mesh;
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    }

     

     

    展开全文
  • Unity3DMeshMeshFilter的使用

    千次阅读 2017-05-22 20:37:25
     需要修改模型的网格数据,首先第一步是要想办法获得模型的mesh,这里我们需要Mesh Filter,unity文档中的解释如下: The Mesh Filter takes a mesh from your assets and passes it to the Mesh Renderer...

    Mesh and MeshFilter

        需要修改模型的网格数据,首先第一步是要想办法获得模型的mesh,这里我们需要Mesh Filter,unity文档中的解释如下:

    The Mesh Filter takes a mesh from your assets and passes it to the Mesh Renderer for rendering on the screen.

    class-MeshFilter-0

    如上图,Robot手里拿的枪的网格数据保存在以gun_model命名的Mesh里,而这个Mesh则隶属于Gun_model的MeshFilter。知道了网格数据保存的位置,接下来需要做的就是获取这些数据并修改它们。下面使用一个简单的cliff模型为例子介绍如何修改模型的网格数据。

     

     

    Simple Example

        首先来看原始的模型长什么样?

    image图 3

        现在需要修改模型的网格数据,把模型最高点的高度坐标挑高一倍,代码如下:

    [csharp] view plain copy
    1. using UnityEngine;  
    2. using System.Collections;  
    3.    
    4. [RequireComponent(typeof(MeshFilter))]  
    5. public class example : MonoBehaviour {  
    6.     void Update() {  
    7.         Mesh mesh = GetComponent<MeshFilter>().mesh;  
    8.     Vector3 [] vertices = mesh.vertices;  
    9.           
    10.     int p = 0;  
    11.     int flag = -1;  
    12.     float maxheight = 0.0F;  
    13.     while (p < vertices.Length) {  
    14.         if(vertices[p].z > maxheight) {  
    15.             maxheight = vertices[p].z;  
    16.             flag = p;      
    17.         }  
    18.         p++;  
    19.    }  
    20.     vertices[flag] += new Vector3(0, 0, maxheight);  
    21.           
    22.     mesh.vertices = vertices;  
    23.     mesh.RecalculateNormals();  
    24.     }  
    25. }  

     注意:本例所使用的模型的local坐标系的z轴相当于unity的y轴,因此上述代码时对z轴进行修改。代码运行的结果如下:

    image图 4

        是不是很简单!unity强大的接口以及较为详细的文档对开发者来说确实是一个福音,另外使用C#编程对于我这苦逼的不合格C++程序员来说确实很爽!

        另外有一点值得注意:上述代码所对应的脚本一定要drag到GameObject里MeshFilter的拥有者,才能使代码生效。如下图5必须要把script拖拽到Cliffs01才能生效,因为在cliffs_1cm的GameObject里只有Cliffs01拥有MeshFilter(如图6)

    image图 5

    image

    图 6

     





    展开全文
  • Unity3DMeshRenderer的使用

    万次阅读 2017-12-20 17:58:20
    操作环境:Win7操作系统、Unity3D 4.0 创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。 添加组件的方法有2种: (Ⅰ)选择一个游戏对象,然后执行Component...
  • Unity3d使用MeshCollider检测区域

    万次阅读 2015-12-22 12:03:45
    如果想将地图分为几个不同区域,并实时检测人物在哪个小区域,而且区域是不规则形状的类似这种地图。很自然的想到使用模型添加meshcollider来通过碰撞...Unity3d圣典 网格碰撞器 Mesh Collider以下为摘选的mesh colli
  • Unity3D学习(15)之Navmesh使用

    千次阅读 2017-05-11 20:16:36
    最近学了Unity3D的自带寻路Navmesh,觉得挺好用的,所以写出来和大家分享一下。 自带寻路Navmesh的三大组件: 1.Nav Mesh Agent:主要挂在寻路物体上 2.Off Mesh Link:实现区域转移功能(例如,有时不一定只是在...
  • 而在Unity3d中内置了NavMesh的自动寻路系统,当我们需要实现寻路系统时可以直接调用内置组件实现功能。 NavMesh寻路的原理 自动寻路算法的发展要追溯到最早的图论算法——Dijlkstra算法,以及基于该算法思想产生的...
  • unity3d meshBaker 基本的使用

    千次阅读 2016-07-19 16:51:17
    meshBaker版本:3.31 drawCall 优化利器 ...最基本的使用 ...一....如上图场景,新建4个材质,分别附上这4个贴图,贴图是MeshBaker自带的。...使用meshBaker 1.创建对象,GameObject->CreateOther->MeshBaker
  • Unity3D 插件 Mesh To Terrain的使用方法

    千次阅读 2018-05-03 14:57:14
    一、首先创建 Terrain 二、调整 terrain 合适的大小,并移动到合适的位置三、打开 Mesh To Terrain 面板四、将 FBX 地形 拖到 GameObjects 上,将Terrain 拖到 Terrain上,点击 Start,就可以创建简单的 Unity3d ...
  • Unity3D - 使用Mesh创建弧面

    千次阅读 2017-12-13 11:21:35
    从官方手册中可以知道,想要使用代码来创建Mesh需要至少四个步骤: 设置顶点数组(想要创建的面一共有多少个顶点) 设置三角形信息(每三个顶点确定一个三角形,要顺时针的设置) 设置法线信息(可以通过mesh的方法...
  • Unity3D使用mesh collider和box collider的区别 踩坑过程记录。 设备是HTC的VIVE 和 Unity 5.x CPU: Intel Xeon Silver 4116 * 2 GPU: NVIDIA Quadro P6000 RAM: 64GB 这个问题是在解决项目卡顿问题的...
  • unity3d版本:4.61(5.6.2会有编译问题 改了就能运行) 作用:本人项目中,从drawCall 60左右 降到了 十几个,优化利器。。 最基本的使用 一.搭建场景 如上图场景,新建4个材质,分别附上这4个贴图,贴图是...
  • Unity3d 提取mesh并保存

    2021-01-05 15:22:22
    Unity3d 提取mesh并保存应用背景下载链接使用步骤贴出脚本 应用背景 有些FBX文件过大,但是只用其中的一个mesh时,我们可以考虑把这个mesh单独提取出来保存问asset文件,这样就打打节省了程序开销。 下载链接 这里我...
  • Unity 3D mesh制作地形工具

    千次阅读 2012-11-19 15:21:38
    如果要把unity3D的工程,转到flash平台,是有一些限制的,其中,unity3d的地形不能使用,这就是一个很大的问题。 所以,使用mesh来替代unity自带的地形,就变成首选的解决方案。 问题接着而来,mesh怎么像unity...
  • 任何一个模型都是由若干个网格面组成,而网格面...添加MeshFilter组件和MeshRenderer组件。 示例代码如下:  //三角形的三个顶点  Vector3 v0 = new Vector3 (5, 0, 0);  Vector3 v1 = new Vector3 (0, 5, 0...

空空如也

1 2 3 4 5 ... 16
收藏数 316
精华内容 126
关键字:

mesh使用 unity3d