unity中一个网格多大 5.6.3 p1多大

&>&&>&&>&&>&正文
求生恐怖新作《帕梅拉(P.A.M.E.L.A.)》PC配置公开 Unity 5引擎打造
10:37:25 来源:游民星空[编译] 作者:青森县 编辑:青森县 浏览:loading
更多相关资讯请关注:
友情提示:支持键盘左右键“← →”翻页
用手机访问
扫一扫,手机浏览
相关新闻:
游戏制作:NVYVE Studios
游戏发行:NVYVE Studios
游戏平台:PC
上市时间:
游戏特色:
没有任何记录
没有任何记录
综合热点资讯
单机游戏下载
| 美味铁板章鱼
| 热心读者
游民星空联运游戏Unity3d&&用鼠标拾取模型的顶点
Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100))
&&&&&&&&&&&
spheretransform.position = hit.
&&&&&&&&&&&
//拾取三角面前提是物体含有一个MeshCollider碰撞器
&&&&&&&&&&&
MeshCollider collider = hit.collider as MeshC
&&&&&&&&&&&
if (collider == null||collider.sharedMesh==null)
&&&&&&&&&&&&&&&
&&&&&&&&&&&
//获取碰撞器所在物体的Mesh网格
&&&&&&&&&&&
Mesh mesh0 = collider.sharedM
&&&&&&&&&&&
//获取Mesh网格的所有顶点
&&&&&&&&&&&
Vector3[] vertices = mesh0.
&&&&&&&&&&&&//获取mesh的三角形索引,这里的索引的就是模型顶点数组的下标
&&&&&&&&&&&
int[] triangles = mesh0.
&&&&&&&&&&&
//然后通过hit.triangleIndex(摄像碰撞到的三角形的第一个点的索引)
&&&&&&&&&&&&//然后+1
,+2,获取三角形另外两个点的坐标
&&&&&&&&&&&
Vector3 p0 = vertices[triangles[hit.triangleIndex * 3]];
&&&&&&&&&&&
Vector3 p1 = vertices[triangles[hit.triangleIndex * 3 + 1]];
&&&&&&&&&&&
Vector3 p2 = vertices[triangles[hit.triangleIndex * 3 + 2]];
&&&&&&&&&&&
Transform transform = collider.
&&&&&&&&&&&&//上面的三个顶点是Mesh的本地坐标,需要用模型的Transform进行转换到世界坐标
&&&&&&&&&&&
p0 = transform.TransformPoint(p0);
&&&&&&&&&&&
p1 = transform.TransformPoint(p1);
&&&&&&&&&&&
p2 = transform.TransformPoint(p2);
&&&&&&&&&&&
//然后设置三个小球的位置到这个三个点,方便调试,呵呵!
&&&&&&&&&&&
GameObject.Find("Sphere1").transform.position = p0;
&&&&&&&&&&&
GameObject.Find("Sphere2").transform.position = p1;
&&&&&&&&&&&
GameObject.Find("Sphere3").transform.position = p2;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置: >
游戏开发中的数学和物理算法:点之间的距离
时间: 10:00 来源:Unity之家 作者:unity.jb51.net 浏览:
1.计算两点之间的距离公式:a2+b2=c2(勾股定理)&&&&&&&&2D:3D:计算机实现:float&Distance2D(Point2D&p1,Point2D&p2)
&&&&float&dx=p1.x-p2.x;
&&&&float&dy=p1.y-p2.y;
&&&&float&distance=sqrt(pow(dx,2)+pow(dy,2));
&&&&return&
}float&Distance3D(Point3D&p1,Point3D&p2)
&&&&float&dx=p1.x-p2.x;
&&&&float&dy=p1.y-p2.y;
&&&&float&dz=p1.z-p2.z;
&&&&float&distance=sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2));
&&&&return&
}2.两点之间的中点公式:2D:3D:计算机实现:Point2D&MidPoint2D(Point2D&p1,Point2D&p2)
&&&&float&sx=p1.x+p2.x;
&&&&float&sy=p1.y+p2.y;
&&&&Point2D&midP
&&&&midPoint.x=sx/2;
&&&&midPoint.y=sy/2;
&&&&return&midP
}3D中点计算
Point3D&Distance3D(Point3D&p1,Point3D&p2)
&&&&float&sx=p1.x+p2.x;
&&&&float&sy=p1.y+p2.y;
&&&&float&sz=p1.z+p2.z;
&&&&Point3D&midP
&&&&midPoint.x=sx/2;
&&&&midPoint.y=sy/2;
&&&&midPoint.z=sz/2;
&&&&return&midP
(责任编辑:脚印)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity编程 ??????程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之Assetbundle的原理(六十一)
Unity3D研究院之Assetbundle的原理(六十一)
围观139849次
编辑日期: 字体:
Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。
Assetbundle可以将Prefab封装起来,这是多么方便啊! 而且我也强烈建议大家将Prefab封装成Assetbundle,因为Prefab可以将游戏对象身上带的游戏游戏组件、游戏脚本、材质都封装在一起。当从服务器上将Assetbundle下载以后直接Instantiate就可以放入游戏中。
试想一下,如果只能将原始的二进制资源文件放在服务器上下载,当资源文件下载完毕后,需要动态的创建游戏对象、然后动态的将脚本绑定在游戏对象、动态的将贴图赋予游戏对象等等各种动态的操作。。所以强烈建议使用Prefa,不解释!!!!!
另外,我在举个例子,因为模型有可能会带很多动画文件,那么这样一组模型资源就可能是多个FBX 文件 和 若干png贴图文件 材质文件。这时我只需要把原始模型放入Prefab中,它就会包含这个模型的所有组件、甚至包括它的动画资源、贴图。那么如下图所示,Mode就是模型的Prefab文件,那么我仅仅只需要把Mode这个预设打包成Assetbundle即可。 当我在服务器上下载这个Assetbundle并且载入游戏中就可以直接使用了,切换动画、换贴图都可以。。
2.二进制文件
也并不是Assetbundle中全都要用预设,Assetbundle它也可以将二进制文件直接封装在里面,比如图片、声音、文本信息等等。
3.场景文件
在Unity中可以将一个场景保存在Scene中,Scene就会包含这个场景中的所有,那能不能把Scene也封装成Assetbundle中?答案是能,但是它不能在移动平台上用,因为移动平台上是不能更新脚本的,换句话来说就是即使将脚本绑定在Prefab中,然后下载Assetbundle后,所有脚本是不会执行的,后面说另外一种巧妙用法。
4.移动平台
上面MOMO已经将Assetbundle 的使用原理大致介绍了一下 ,我们在谈谈移动平台。脚本不能更新是移动平台下最大的伤,这就意味着开发者无法绕过App store和 google Play这种在线商店升级应用程序。唯一能做到的就是更新资源、举个例子,游戏中在处理版本升级时,一般会有个大版本号和一个小版本号,大版本号就是 2.0、3.0这种 版本需要在AppStore中更新,大版本主要是升级游戏脚本,然后当小版本号,比如2.0.1 或2.0.2这种只是更新游戏中的资源,通过自己游戏的服务器就可以完成,通过Assetbundle在自己服务器上下载,然后适应在游戏中。如果非要更新脚本,或不得不更新脚本那么只能在Appstore或者google Play去更新大版本。
移动平台上不能更新脚本,那么Prefab上绑定的脚本怎么办?在任何平台上都可以把脚本添加到Prefab上,然后打包成Assetbundle,只有移动平台上有点特殊,比如将Test.cs这条脚本绑定在Prefab中,最后程序通过服务器下载这个Assetbundle ,当载入工程中这条脚本是不会被执行的。
但是如果本地工程有Test.cs这条脚本,那么Unity会自动将这条脚本绑定在下载的Prefab中,并且他们执行的非常好。如果本地工程中没有Test.cs这条脚本,那么Prefab上的脚本是永远都不会执行的。有时我们会在脚本中写一些Public的变量,有可能不同的Prefab上绑定的是相同的脚本,只是Inspector 脚本中的public参数不同。别担心这一点Assetbundle 中的Prefab也是没问题,所以说只要大版本中的脚本没问题,在小版本中只更新游戏资源是一点问题都么有的。
5.移动优化
之前我们说过可以将游戏中的某个游戏对象封装成Assetbundle,也可以将游戏中的整个场景也封装成Assetbundle。但是我认为需要巧妙的使用封装场景,因为场景中肯定有很多公用的模型,如果打包场景的话那么内存与size就是 公用模型的size * N个场景,想想其实挺恐怖的。其实我们可以巧妙的使用,首先把场景中公用的部分和私有的部分统统放入Unity, 然后烘培整个场景。 当场景烘培完毕后把公用的模型部分在拿出去,场景只只保留私有的模型。还可以做一个工具将公用模型在场景中的坐标保存在XML中(每个场景文件会对应一个公用模型的XML信息),最后在将公用的模型分别封装在别的Assetbundle中。
服务器上提供每个场景的Assetbundle ,和公用模型的Assetbundle,一般公用模型的Assetbundle可以放在常驻内存中(可能使用频繁、根据项目的不同而定)场景Assetbundle下载完毕后,现载入场景然后在根据场景对应的XML信息将公用模型部分动态的在添加到场景中,这样就完成了一个场景的构建。
对游戏中所有资源进行打包,比如按类型分为五个大部分
界面,模型,特效,声音,场景,脚本。
界面部分:
公用资源包(可复用的资源包)和 每个界面独有得资源包(不可复用的资源包)统一使用Prefab 打包成.assetbundle 二进制格式。
模型部分:
按角色分类,统一使用Prefab 打包成.assetbundle 二进制格式。 模型部分包括模型文件与动画文件,每一个模型文件对应一组动画文件。(如果模型需要换装还需提供对应换装的模型与贴图) ,因为unity4的重定向动画不支持动态加载,所以目前不需要考虑 不同大小 不同规格 不同性别 的模型重定向动画。
特效部分: 统一使用Prefab 打包成.assetbundle 二进制格式。
声音部分: 统一使用Prefab 打包成.assetbundle 二进制格式。
场景部分:场景和前面的有点区别,场景需要导出烘培的光信息并且只能烘培场景之上永远不动的模型,但是这些永远不动的模型有可能会同时在多个场景中使用,所以场景烘培完毕后要把重复使用的对象删除,(运行游戏在动态的加载进来)场景中只保留该场景中永远不会变的模型,以及烘培的光照信息。 打包场景后会生成.unity3D 二进制格式,它和 assetbundle 打包方式是不同的。(另外,也可以考虑 json xml 二进制 来动态组装场景)。
脚本部分:如果Prefab上是带脚本打包Assetbundle的话
脚本是不会被运行的(移动平台), 但是unity有一个技巧,Prefab上的脚本 如果本地有的话它会把本地的同名脚本绑定在Prefab对象上,它会很好的执行。
Prefab打包技巧: Prefab打包时自身是不占多少空间的 &=1KB
但是Prefab上是可以关联
这五大部分 “界面,模型,特效,声音,场景,脚本”以及在Hierarchy视图中 坐标/缩放/旋转。 关联这些信息以后就会很大,所以为了避免资源的浪费尽量避免Prefab重复关联。
一个prefab下面可以同时关联多个游戏对象 ,这里举个例子如果你的 Prefab下面放了一个模型 它的大小可能是500k
,在 Prefab下面放了十个完全相同模型 它的大小可能是501k 。 如果Prefab下面放了两个不同的模型,它的大小可能就会是 500k x 2 的size
,也就是说Prefab与关联的数量是无关的 。
加密部分: assetbundle 是可以转换成 字节数组 ,客户端与服务器约定一组解密 字节数组的算法就可以实现资源加密。
大版本升级:
unity的版本升级其实主要是升级主程序中的脚本。 因为所有的资源都是assetbundle 和 .unity3d
这些资源放在本地或者服务器 解包的方式是完全一样,所以理论上我们的主程序包的大小可以做到很小,可以很好设置把多少资源放在包里 或者把所少资源放在服务器上。在运行的时候服务端应该把所有 assetbundle 和 .unity3d的资源文件的下载地址列表返回给客户端。
小版本升级:
小版本升级也就是更新资源,因为不能更新脚本, 在登陆的时候服务端应该把所有 assetbundle 和 .unity3d的资源文件的下载地址列表返回给客户端。
还有个需要考虑的地方,比如现在大版本是2.0.0 ,小版本已经是2.0.5 ,用户的手机上是一个1.5.0的包。 此时用户在打开游戏的时候 应当强制它去appstore中去下载大版本2.0.0 ,当用户下载完毕后登陆游戏,此时服务器告诉客户端现在已经是2.0.5的小版本了,这时候客户端去下载对应小版本的所有
assetbundle 和 .unity3d文件地址列表。
增量更新:理论上增量更新是可行的。因为unity不能更新脚本,所以在处理增量更新的话 需要在代码中做可以兼容增量更新的可能。
因为Assetbundle这块的代码比较多,我还是决定分成两篇文章来写,这篇文章先说原理、下篇文章说代码。欢迎大家来讨论!
前几天我和Unity鑫哥聊天,他告诉我IOS上是无法运行时更新脚本、但是Android上是可以运行时更新脚本,我回家也试了一下但是没能成功,后来我考虑即使成功了项目中我也不打算那么做,因为这样Android和IOS 做起来的差别就太多了, 另外Unity商店中有一个处理运行时更新脚本的插件 unityLua 大家可以去研究研究。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3D--网络(三)服务器返回的数据解析 - 简书
Unity3D--网络(三)服务器返回的数据解析
使用Unity做游戏开发,包括以后的VR游戏等联网功能是必不可少的,所以跟服务器打交道也就必不可少。其实在其他语言开发环境中也需要与服务器打交道,而所使用的数据格式都是一样的。所以说,我们可以不会搭建服务器的业务逻辑,但是服务器返回给客户端的数据,是我们必须要会的。
1、服务器返回的数据格式
目前最常见的就是Json与XML格式
1-2、什么是Json?
它是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式(文件下载除外 JSON的格式很像C#中字典和数组,类对象标准的Json:key必须用双引号。
{“name” : "Jack", "age" : "10"}
{"names" :["Jack","rose","jock"] }
1-3、什么XML?
全称是Extensible Markup Language,译作“可扩展标记语言”跟JSON一样,也是常用的一种用于交互的数据格式一般也叫XML文档(XML Document)
&photo name="全家福 第01张" height="80" /&
&photo name="全家福 第02张" hright="90" /&
&photo name="全家福 第03张" hright="60" /&
一个常见的XML文档一般由以下部分组成**
1-文档声明
在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
最简单的声明
&?xml version="1.0" ?&
用encoding属性说明文档的字符编码
&?xml version="1.0" encoding="UTF-8" ?&
2-元素(Element)
一个元素包括了开始标签和结束标签
拥有内容的元素:&photo&小黄人&/photo&
没有内容的元素:&photo&&/photo&
没有内容的元素简写:&photo/&
一个元素可以嵌套若干个子元素(不能出现交叉嵌套)
&name&全家福 第01张&/name&
&height&80&/height&
XML中的所有空格和换行,都会当做具体内容处理
下面两个元素的内容是不一样的
&video&小黄人&/video&
3-属性(Attribute)
一个元素可以拥有多个属性
&photo name="全家福 第一张" height="80" /&
video元素拥有name和length两个属性
属性值必须用 双引号"" 或者 单引号'' 括住
实际上,属性表示的信息也可以用子元素来表示,比如
&name&全家福 第一张&/name&
&height&30&/height&
2、Json解析
先来看一段服务器返回的数据格式:
"name" : "jack",
"height" : 1.99,
"school" : {
“name” : “雷潮",
“address” : “深圳南山区"
"photos" : [
"icon" : "beauty.png",
"time" : ""
"icon" : "nice.png",
"time" : ""
"icon" : "good.png",
"time" : ""
Paste_Image.png
Json基本结构一:
用{}包裹,用名称/值来表示对象中的一个属性.
class Person
public Person()
public Person(string _name, int _age)
p = new Person(“lilei”,20);
用Json表示:
{“name” : “lilei”, “age” : “20”};
Json基本结构二:
[]包裹,表示一个对象属性下面的多个元素内容{“Persones” :[{“name” : “LiLei”, “age” : “20”},{“name” : “HanMeiMei”, “age” : “21”}]}
案例1: 解析服务器返回的这段Json数据
此处使用LitJson进行解析
{"id" : 10,"Name" : "Leichao","age":28},
{"id" : 20,"Name" : "LinfenPiPi","age":20},
{"id" : 30,"Name" : "SunYin","age":27}
######解析1:解析出我们可以识别的对象
string path = "Assets/Resources/TextFile.txt";
string textOne = File.ReadAllText(path);
JsonData data1 = JsonMapper.ToObject(textOne);
for (int i = 0; i & data1.C i++)
JsonData nameValue = data1[i]["Name"];
Debug.Log(nameValue);
NameText.text = nameValue.ToString();
JsonData IDValue = data1[i]["id"];
IDText.text = IDValue.ToString();
JsonData AgeValue = data1[i]["age"];
AgeText.text = AgeValue.ToString();
Debug.Log("名字是:" + NameText + "ID:" + IDText);
解析2:解析出来并给对象赋值
Person[] p = new Person[] {
p1 = new Person(),
p2 = new Person(),
p3 = new Person()
string path = "Assets/Resources/TextFile.txt";
string textOne = File.ReadAllText(path);
JsonData data = JsonMapper.ToObject(File.ReadAllText(path));
Debug.Log(p.Length);
for (int i = 0; i &data.C i++)
JsonData idValue = data[i]["id"];
p[i].id = int.Parse(idValue.ToString());
JsonData AgeValue = data[i]["age"];
p[i].age = int.Parse(AgeValue.ToString());
JsonData nameValue = data[i]["Name"];
p[i].name = nameValue.ToString();
Debug.Log("name :" + nameValue.ToString());
Debug.Log("------------" +p[0].age + "++++++" + p[1].name);
string str = @"
: ""SunYin"",
""Birthday"" : """",
""Urls"":[
""/p/ef122b64d34f"",
""/p/a5c"",
解析方式:
JsonData data = JsonMapper.ToObject(str);
Debug.Log("name = " + (string)jd["Name"]);
Debug.Log("Age = " + (int)jd["Age"]);
Debug.Log("Birthday = " + (string)jd["Birthday"]);
JsonData dataUrls = data["Urls"];
for (int i = 0; i &dataUrls.C i++)
Debug.Log("URL = " + dataUrls[i]["Url"]);
3、XML解析
XML的解析方式有2种DOM:一次性将整个XML文档加载进内存,比较适合解析小文件SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
XmlDocument
- CreatElement() : //创建一个元素
- AppendChild():
//往节点下追加根节点
- Save() //保存XML文件
XmlDeclaration
- CreatXMLDeclaration() // 创建XML的声明节点
XmlElement
-GetElementsByTagName() // 根据节点名称获取下面的该节点名称的子节点元素
-setAttribute() // 设置元素的属性
-GetAttribute() // 获得元素的属性
- InnetText
XmlNode(XmlElement的基类)
XmlNodeList
&Persones&
&id& 1 &/id&
&name lang = “En”& jim&/name&
&damage& 100&/damage&
&/Persones&
calss Person
public int ID {}
public string Name{}
public string Lang{}
public int Damage{}
public override string ToString()
rerturn string.Format(“id:{0},Name:{1},Lang:{2},Damage:{3}”,ID,Name,Lang,Damage);
Paste_Image.png
Paste_Image.png
引用System.Xml空间
// 专门用来解析XML文档的
XmlDocument doc = new XmlDocument()
// 此文件必须在程序集中
doc.load(“需要解析的文件名称”);
// 专门用来解析XML文档的
XmlDocument doc = new XmlDocument();
// 此文件必须在程序集中
// doc.Load("XML信息");
string path = "Assets/Resources/XML信息.xml";
doc.LoadXml(File.ReadAllText(path));
// 先得到根节点,第一个节点
XmlNode rootNode = doc.FirstC
// 获取根节点的所有节点
XmlNodeList nodeList = rootNode.ChildN
// 得到所有的子节点,我们通过数组或者列表保存
List&PersonXML& Persones = new List&PersonXML&();
// 接着遍历所有的节点,拿到每一个节点,保存到我们的数组与集合中
foreach (XmlNode PersonNode in nodeList) {
XmlNodeList propertyPerson = PersonNode.ChildN // 获取PersonNode下面的所有节点
PersonXML p = new PersonXML(); // Person里面有XML文档中的每一个属性
foreach (XmlNode property in propertyPerson)
if (property.Name == "id")
p.ID = int.Parse(property.InnerText); // 获取内部文本
else if (property.Name == "name")
p.Name = property.InnerT
p.Lang = property.Attributes[0].V
else if (property.Name == "damage")
p.Damage = int.Parse(property.InnerText);
Debug.Log(p);
关于创建XML文档
贴图一张,自己去研究吧
4、两者的比较同一份数据,既可以用JSON来表示,也可以用XML来表示JSON的体积小于XML,所以服务器返回给移动端的数据格式以JSON居多,而对于客户端两者都ok!
追寻梦想,成就自己。虚拟现实群:(资源学习群) 二群(交流群),如果转载文章:请注明出处,否则追究责任!Ps:来深圳线下学习VR开发请联系:}

我要回帖

更多关于 unity3d多大 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信