一眨眼学习Unity3D 也有一段时间了,基本已经拿下了这套游戏引擎,回过头来想想以前写的RPG 游戏引擎,越来越发现以前写的就是垃圾。人果然是要不断学习与不断进步,好好学习,天天向上。哇咔咔~ 加油!!
最近做一个项目须要去绘制线与绘制面,那么把这两天的学习笔记整理一下,一是给自己留作备忘,二是方便初学者学习。
任何一个无规则曲线它都是有若干个线段组成,及时是圆形它也是又若干个线段组成的,也就是说将若干个线段拼接起来就是我们须要的无规则曲线~那么在3D 的世界中我们须要知道 X Y Z 三个点来确定一条3D线段。

首先先使用Unity编辑器的方式来添加一条线~
Unity -> GameObject -> Create Empty 创建一个空的对象,我命名为line。然后点击 Component -> Miscellaneous -> Line Renderer 给line添加一个线渲染器的属性,Line Renderer是非常中的属性,下面我会详细的说明。
Create -> Material 创建一个材质,做来这个线段的贴图,下面我们看看Line Renderer的一些重要参数。
Cast Shadows: 是否投射阴影。
Receive Shadows: 是否接收阴影。
Materials :设置材质,这里可以设置多个材质, line就是上面我们创建的材质,这里我给line这个材质涂上了红颜色。
Positions:这个属性就比较重要了,它是专门设置线段在3D 世界中的点的坐标,size 设置点的数量 为3 那么将会有3个点,Element 0  Element 1 Element 2    这三个点将确定这条曲线分为两段,第一段是(0,0,1) 到  (0,0,2) ,第二段是 (0,0,2) 到(0,0,4)。
Paramerters 
StartWidth :设置起点的宽度  
EndWidth:  设置终点的宽度 ,这两项数值默认为1,但是现实起来很宽,所以一般都设置为0.几~ 
Start Color: 设置起点颜色
Start Color: 设置终点颜色
Use World Space 使用世界坐标系
大家看看效果,清楚的可以看到曲线分为两部分,第一部分较短 第二部分较长。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using
UnityEngine;
using
System.Collections;
using
System.Threading;
 
public
class
Main
:
MonoBehaviour
{
 
//游戏对象,这里是线段对象
private
GameObject
LineRenderGameObject;
 
//线段渲染器
private
LineRenderer
lineRenderer;
 
//设置线段的个数,标示一个曲线由几条线段组成
private
int
lineLength
=
4;
 
//分别记录4个点,通过这4个三维世界中的点去连接一条线段
private
Vector3
v0
=
new
Vector3(1.0f,0.0f,0.0f);
private
Vector3
v1
=
new
Vector3(0.0f,1.0f,0.0f);
private
Vector3
v2
=
new
Vector3(0.0f,0.0f,1.0f);
private
Vector3
v3
=
new
Vector3(1.0f,0.0f,0.0f);
 
void
Start(){
 
//通过之前创建的对象的名称,就可以在其它类中得到这个对象,
//这里在main.cs中拿到line的对象
LineRenderGameObject
=
GameObject.Find
("line");
 
//通过游戏对象,GetComponent方法
传入LineRenderer
//就是之前给line游戏对象添加的渲染器属性
//有了这个对象才可以为游戏世界渲染线段
lineRenderer
=
(LineRenderer)LineRenderGameObject.GetComponent
("LineRenderer");
 
//设置线段长度,这个数值须要和绘制线3D点的数量想等
//否则会抛异常~~
lineRenderer.SetVertexCount(lineLength);
 
}
 
void
Update()
{
 
//在游戏更新中去设置点
//根据点将这个曲线链接起来
//第一个参数为
点的ID
//第二个
参数为点的3D坐标
//ID
一样的话就标明是一条线段
//所以盆友们须要注意一下!
 
lineRenderer.SetPosition
(0,
v0);
lineRenderer.SetPosition
(1,
v1);
lineRenderer.SetPosition
(2,
v2);
lineRenderer.SetPosition
(3,
v3);
 
}
 
}

通过上面代码的设置,运行游戏,发现全新的一个三角形曲线赫然的映入我们的眼帘,有了上面的方法我们就可以组合的绘制出各种各样的3D 游戏曲线了,这里MOMO使用的是颜色,大家也可以添加一个贴图~

绘制面的话~,因为3D世界中游戏面全都是用三角形来拼起来的(出于效率的考虑),所以大家所看到的面其实都是用三角面拼接起来的。那么下面我们看看在Unity3D 中如何绘制三角形平面。先创建一个GameObject对象,我命名为face,然后给这个对象添加两个Mesh属性, 添加MeshFilter(网格过滤器)与mesh Renderer(网格渲染器)属性,这样子就可以绘制网格面了。  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using
UnityEngine;
using
System.Collections;
 
public
class
Main
:
MonoBehaviour
{
 
//
Update is called once per frame
void
Update
()
{
 
//通过object对象名
face 得到网格渲染器对象
MeshFilter
meshFilter
=
(MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
 
//通过渲染器对象得到网格对象
Mesh
mesh
=
meshFilter.mesh;
 
    //API中写的不是提清楚,我详细的在说一遍
 
    //设置顶点,这个属性非常重要
    //三个点确定一个面,所以Vector3数组的数量一定是3个倍数
    //遵循顺时针三点确定一面
    //这里的数量为6
也就是我创建了2个三角面
    //依次填写3D坐标点
mesh.vertices
=
new
Vector3[]
{new
Vector3(5,
0,
0),
new
Vector3(0,
5,
0),
new
Vector3(0,
0,
5),new
Vector3(-5,
0,
0),
new
Vector3(0,
-5,
0),
new
Vector3(0,
0,
-5)};
 
//设置贴图点,因为面确定出来以后就是就是2D
//所以贴纸贴图数量为Vector2
//第一个三角形设置5个贴图
//第二个三角形设置一个贴图
//数值数量依然要和顶点的数量一样
mesh.uv
=
new
Vector2[]
{new
Vector2(0,
0),
new
Vector2(0,
5),
new
Vector2(5,
5),new
Vector2(0,
0),
new
Vector2(0,
1),
new
Vector2(1,
1)};
 
//设置三角形索引,这个索引是根据上面顶点坐标数组的索引
//对应着定点数组Vector3中的每一项
//最后将两个三角形绘制在平面中
//数值数量依然要和顶点的数量一样
mesh.triangles=
new
int
[]{0,1,2,3,4,5};
 
}
}

Build and Run  运行效果后清楚的可以看到两个三角形。MOMO提醒大家 善用三角平面可以绘制出各种各样的游戏面出来噢~哇咔咔~

最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,总的来说这一章还是比较简单的,不过也是非常重要的一章。代码我就不上传了。哇咔咔~ MOMO愿和 大家好好学习,大家一起进步哈~!!!

Unity3D研究院之游戏对象的访问绘制线与绘制面详解(十七)的更多相关文章

  1. CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解

    CAS (6) -- Nginx代理模式下浏览器访问CAS服务器网络顺序图详解 tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 nginx版本: nginx-1. ...

  2. (转)Unity3D研究院之游戏架构脚本该如何来写(三十九)

     这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏 ...

  3. Unity3d 如何找到游戏对象并改变其颜色

    //游戏对象 private var obj:GameObject; //渲染器 private var render:Renderer; //贴图 private var texture:Textu ...

  4. 应用层(一)HTTP服务访问基本流程和HTTP报文详解

    HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...

  5. JSP中的内置对象和Struts中的Web资源的详解

    JSP中的内置对象有如下几种: request :继承于HttpServletRequest, HttpServletRequest继承ServletRequest, 获得的Request对象的方法: ...

  6. jQuery对象数据缓存Cache原理及jQuery.data详解

    网上有很多教你怎么使用jQuery.data(..)来实现数据缓存,但有两个用户经常使用的data([key],[value])和jQuery.data(element,[key],[value])几 ...

  7. unity绘制线和绘制面

    绘制线条代码,其实就是指定至少两个点,然后赋予贴图即可,不废话,上代码: using UnityEngine; using System.Collections; public class LineT ...

  8. xml和java对象互转:JAXB注解的使用详解

    先看工具类: import org.slf4j.Logger; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; ...

  9. OpenGL之位图的绘制和gluOrtho2D等函数详解

    位图绘制 先来段代码吧: #include <iostream> #include <gl/glut.h> using namespace std; #pragma comme ...

随机推荐

  1. MySQL 更新和删除

    更新和删除的操作SQL语句比較简单,只是要注意使用UPDATE的时候.要注意WEHER条件的限制,以下的语句是仅仅更新id为10005的email地址,假设不加WHERE语句限制,那么将表中全部的em ...

  2. asp.net 列表控件

    web空间类都被放置在System.Web.UI.WebControls命名空间下1.ListBox  ListBox控件用于创建多选的下拉列表,而可选项是通过ListItem元素来定义的.示例代码如 ...

  3. HttpURLConnection访问网络

    HttpURLConnection是一个抽象类,获取HttpURLConnection对象HttpURLConnection urlConnection=new URL(http://www.baid ...

  4. mac 中安装redis 以及 安装php-redis扩展过程详细记录

    1. 通过homebrew 安装 redis sodu brew install redis 2. 安装后执行开启redis,采用默认配置, 默认配置只有本地(127.0.0.1)可以访问.需要远程访 ...

  5. cc、gcc、g++区别

    gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...

  6. Automating hybrid apps

    Automating hybrid apps One of the core principles of Appium is that you shouldn’t have to change you ...

  7. POSTGRESQL主备部署模式

    一.预期目的 主数据库(Primary pg ,假定主机名为A,后文不再赘述)和备用数据库(Standby pg,假定主机名为B,后文不再赘述)之间的数据能够相互备份. 主数据库发生故障时备用数据库可 ...

  8. Lua学习笔记(1) ——语法

    1.  Lua -i main.lua -i 进入交互模式 -l 加载一个库 -e  “lua code” 直接在命令行执行lua code 2. 注释 -- This is a line comme ...

  9. 周期性计划(一个cron守护进程):

    周期性计划(一个cron守护进程): root@ubuntu:/etc# ps -ef | grep cron root 903 1 0 16:25 ? 00:00:00 /usr/sbin/cron ...

  10. Vue中的methods、watch、computed

    看到这个标题就知道这篇文章接下来要讲的内容,我们在使用vue的时候methods.watch.computed这三个特性一定经常使用,因为它们是非常的有用,但是没有彻底的理解它们的区别和各自的使用场景 ...