unity3d外部资源文件怎么3dunity 导入max文件

细说Unity3D(一)——移动平台动态读取外部文件全解析 - 推酷
细说Unity3D(一)——移动平台动态读取外部文件全解析
一直有个想法,就是把工作中遇到的坑通过自己的深挖总结成一套相同问题的解决方案供各位同行拍砖探讨。眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑和手指了。那么今天开始,小匹夫会记录一些平时工作中遇到的坑,以及小匹夫的应对方法,欢迎各位拍砖讨论。那么今天主要讨论一下Unity3D在移动端如何动态的读取外部文件,比如csv(txt),xml一类的文件。主要涉及的问题,就是PC端上本来测试的好好的东西,到了移动端就不能用了,所以要讨论一下PC端和移动端的区别,那么下一个问题自然而然的就是移动端的资源路径(要讨论一下Resources、StreamingAssets、AssetBundle、PersistentDataPath),最后一步就是找到了资源如何读取(这里也会具体到对应的几种情况,即Resources、StreamingAssets、AssetBundle),主要的思路就是这样啦。对嘞,前言部分还是要祝各位看官新的一年身体健康,升职加薪。
假如我想在editor里动态读取文件
实际的游戏开发中,其实有相当一部分静态数据是可以放在客户端的,所以势必会产生要动态读取这些文件的需求,比如csv(其实就是文本文件),xml等等。我相信大家不管是用win还是用mac来做unity3d的开发,都一定要先在editor中去实现基本的功能,在具体到各个移动平台上去调试。所以作为要读取外部文件的第一步,显然我们要先在editor也就是pc上实现这个功能。
下面给各位举一个读取xml的例子,也是我在以前的一篇文章《
》中使用过的,动态读取一个xml文件并动态生成一个类。
下面是我们用来做例子的xml文件,Test.xml:
&?xml version=&1.0& encoding=&UTF-8&?&
&name&chenjd&/name&
&blog&http:///murongxiaopifu/&/blog&
&organization&Fanyoy&/organization&
&age&25&/age&
我们就可以很任性的把这个文件随便丢在一个地方,只要你能指定对它的地址。例如我还把它放在那篇文章中的地址 Assets/xml-to-egg/xml-to-egg-test/ 文件夹下(的确很任性)
下面我们实现在PC上读取这个文件内容的代码:
//读取xml测试
using UnityE
using System.C
using EggT
using System.Xml.L
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
XElement result = LoadXML(&Assets/xml-to-egg/xml-to-egg-test/Test.xml&);//任性的地址
Debug.Log(result.ToString());
// Update is called once per frame
void Update () {
XElement LoadXML(string path)
XElement xml = XElement.Load(path);
结果如下:
结果是读取成功了。但是你以为到这一步就成功了,那就错了。因为这样的代码到移动端是行不通的,至少2处可以被骂sb:
醉人的地址,地址参数那样写就不用考虑跨平台了。所以这个sb点引出的问题就是在 移动端unity3d找不到目标文件 。
使用的还是pc上传统的一套读取资源的做法,没有使用unity3d提供的方法,所以可能导致的问题是找得到文件但是 没有正确的读取文件内容 。
以上用红色标出的问题,便是小匹夫想到的可能出现的问题,也是下文要讨论的内容。那么我们首先来看看资源路径在各个平台上的不同之处吧。
移动平台的资源路径问题
想要读取一个文件,自然首先要找到这个文件,下面小匹夫首先会总结一下unity3d中存在的各个地址,之后再总结一下各个地址在各个移动平台中的对应位置。
Unity3D中的资源路径
Application.dataPath
此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。
Application.streamingAssetsPath
此属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。
Application.persistentDataPath
此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。
Application.temporaryCachePath
此属性用于返回一个临时数据的缓存目录。
android平台
Application.dataPath
/data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath
jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath
/data/data/xxx.xxx.xxx/files
Application.temporaryCachePath
/data/data/xxx.xxx.xxx/cache
Application.dataPath
Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath
Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPath
Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath
Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
从上面的3张表格,我们可以看到 dataPath和streamingAssetsPath的路径位置一般是相对程序的安装目录位置,而persistentDataPath和temporaryCachePath的路径位置一般是相对所在系统的固定位置。那么现在明确了unity3d中各个地址在不同平台上的含义,下一个问题就来了,也就是我打包之后的资源要怎么和这些地址对应上呢?要知道在pc的editor里默认的资源文件存放的路径就是Assets啊,为何又会派生出那么多路径呢?那么就带着这个疑问,和小匹夫一起进行下文的内容吧。
简单介绍一下unity3d中资源的处理种类(欢迎拍砖):
小匹夫遇到过的大体就是如下几种了,Resources、StreamingAssets、AssetBundle、PersistentDataPath,下面简单分析一下。
Resources:
是作为一个Unity3D的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中。它的特点简单总结一下就是:
只读,即不能动态修改。所以想要动态更新的资源不要放在这里。
会将文件夹内的资源打包集成到.asset文件里面。因此建议可以放一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包的大小。
主线程加载。
资源读取使用Resources.Load()。
StreamingAssets:
要说到StreamingAssets,其实和Resources还是蛮像的。同样作为一个只读的Unity3D的保留文件夹出现。不过两者也有很大的区别,那就是Resources文件夹中的内容在打包时会被压缩和加密。而StreamingAsset文件夹中的内容则会原封不动的打入包中,因此StreamingAssets主要用来存放一些二进制文件。下面也同样做一个简单的总结:
同样,只读不可写。
主要用来存放二进制文件。
只能用过WWW类来读取。
AssetBundle:
关于AssetBundle的介绍已经有很多了。简而言之就是把prefab或者二进制文件封装成AssetBundle文件(也是一种二进制)。但是也有硬伤,就是在移动端无法更新脚本。下面简单的总结下:
是Unity3D定义的一种二进制类型。
最好将prefab封装成AseetBundle,不过上面不是才说了在移动端无法更新脚本吗?那从Assetbundle中拿到的Prefab上挂的脚本是不是就无法运行了?也不一定,只要这个prefab上挂的是本地脚本,就可以。
使用WWW类来下载。
PersistentDataPath:
看上去它只是个路径呀,可为什么要把它从路径里面单独拿出来介绍呢?因为它的确蛮特殊的,这个路径下是可读写。而且在IOS上就是应用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的时候,ProjectSetting页面有一个选项Write Access,可以设置它的路径是沙盒还是sdcard。下面同样简单的总结一下:
内容可读写,不过只能运行时才能写入或者读取。 提前将数据存入这个路径是不可行的。
无内容限制。你可以从 StreamingAsset 中读取二进制文件或者从 AssetBundle 读取文件来写入 PersistentDataPath 中。
写下的文件,可以在电脑上查看。同样也可以清掉。
好啦,小匹夫介绍到这里,各位看官们是不是也都清楚了一些呢?那么下面我们就开始最后一步了,也就是如何在移动平台如何读取外部文件。
移动平台读取外部文件的方法
上文小匹夫之所以要介绍Resources、StreamingAssets、AssetBundle、PersistentDataPath这四个东东,就是因为读取外部资源的操作所涉及到的东西无外乎这几种。既然是用Unity3D来开发游戏,那么自然要使用Unity3D规定的操作方式,而不是我们在PC上很原始的那种操作方式来操作咯。否则就会像本文一开始所演示的那样,写出移动端无法使用的很傻的代码来。
下面小匹夫就分别实现一下利用Resources、StreamingAssets、AssetBundle来读取的过程。
Resources:
首先我们新建一个Resources目录,并且将上面我们用到的Test.xml复制一份到这个文件夹中。如图:
然后我们通过Resources的读取方法来读取Test.xml的内容。并且调用GUI将xml的内容绘制出来。
//用Resources读取xml
using UnityE
using System.C
using EggT
using System.Xml.L
using System.X
public class Test : MonoBehaviour {
private string _
// Use this for initialization
void Start () {
LoadXML(&Test&);
// Update is called once per frame
void Update () {
private void LoadXML(string path)
_result = Resources.Load(path).ToString();
XmlDocument doc = new XmlDocument();
doc.LoadXml(_result);
void OnGUI()
GUIStyle titleStyle = new GUIStyle();
titleStyle.fontSize = 20;
titleStyle.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f);
GUI.Label(new Rect(400, 10, 500, 200),
_result,titleStyle);
结果如图:
OK,Resources读取外部资源目标达成!!
下面我们继续,这次则是使用StreamingAssets来操作。
StreamingAssets:
同Resources一样,我们要新建一个StreamingAssets的文件夹来存放我们的Test.xml文件。如图:
不过前文已经说了,StreamingAssets文件夹内的东西并不会被压缩和加密,而是放进去什么就是什么,所以一般是要放二进制文件的,这里小匹夫仅仅做一个演示,各位在实际操作中切记不要直接把数据文件放到这个目录中打包。
using UnityE
using System.C
using EggT
using System.Xml.L
using System.X
using System.IO;
public class Test : MonoBehaviour {
private string _
// Use this for initialization
void Start () {
StartCoroutine(LoadXML());
// Update is called once per frame
void Update () {
/// &summary&
/// 如前文所述,streamingAssets只能使用www来读取,
/// 如果不是使用www来读取的同学,就不要问为啥读不到streamingAssets下的内容了。
/// 这里还可以使用了persistenDataPath来保存从streamingassets那里读到内容。
/// &/summary&
IEnumerator LoadXML()
string sPath= Application.streamingAssetsPath + &/Test.xml&;
WWW www = new WWW(sPath);
yield return
_result = www.
void OnGUI()
GUIStyle titleStyle = new GUIStyle();
titleStyle.fontSize = 20;
titleStyle.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f);
GUI.Label(new Rect(400, 10, 500, 200),
_result,titleStyle);
结果如图:
OK,StreamingAssets读取外部资源目标达成!!
下面我们继续,最后则是使用AssetBundle来操作。
AssetBundle:
来到AssetBundle,这里就和上面两个不一样了。首先我们要把我们的文件Test.xml打成AssetBundle文件,由于小匹夫使用的是小米3作为测试机,所以AssetBundle的平台选择为Andorid。
如图,我们创建了一个AssetBundle文件,并命名为TextXML。并且按照二进制文件放入StreamingAssets文件夹中的惯例,将这个AssetBundle文件放入StreamingAssets文件夹。
那么下面就是从AssetBudle中读取Test.xml的内容咯。直接上代码:
//从AssetBundle中读取xml
using EggT
using System.Xml.L
using System.X
using System.IO;
public class Test : MonoBehaviour {
private string _
// Use this for initialization
void Start () {
LoadXML();
// Update is called once per frame
void Update () {
void LoadXML()
AssetBundle AssetBundleCsv = new AssetBundle();
//读取放入StreamingAssets文件夹中的bundle文件
string str = Application.streamingAssetsPath + &/& + &TestXML.bundle&;
WWW www = new WWW(str);
www = WWW.LoadFromCacheOrDownload(str, 0);
AssetBundleCsv = www.assetB
string path = &Test&;
TextAsset test = AssetBundleCsv.Load(path, typeof(TextAsset)) as TextA
_result = test.ToString();
void OnGUI()
GUIStyle titleStyle = new GUIStyle();
titleStyle.fontSize = 20;
titleStyle.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f);
GUI.Label(new Rect(400, 10, 500, 200),
_result,titleStyle);
结果如图:
OK,AssetBundle读取外部资源目标也达成了!!
这样,我们就实现了几种动态读取外部文件的操作。各位看官是否看明白了呢?当然文章仓促,还有很多不足,欢迎大家拍砖探讨~
如果各位看官觉得文章写得还好,那么就容小匹夫各位给点个“推荐”,谢啦~
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3687)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'unity3d 资源发布时文件导出的问题 将文件放到 StreamingAssets 文件夹',
blogAbstract:'Most assets in Unity are combined into the project when it is built. However, it is sometimes useful to place files into the normal filesystem on the target machine to make them accessible via a pathname. An example of this is the deployment of a movie file on iOS the original movie file must be',
blogTag:'unity3d,资源发布',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}您所在的位置: &
Unity3D开发:向Unity3D中导入外部模型
Unity3D开发:向Unity3D中导入外部模型
本文属于Unity3D引擎开发基础教程系列,Unity3D支持多种外部导入的模型格式,这里列出了它支持的外部模型的属性,并且以3D MAX为例,导出FBX文件给Unity3D使用。
Unity3D支持多种外部导入的模型格式,但它并不是对每一种外部模型的属性都支持。具体的支持参数,您可以对照如下列表:
Maya的.mb和.mal格式
3D Studio Max的.maxl格式
Cheetah 3D的.jasl格式
Cinema 4D的.c4dl 2格式
Blender的.blendl格式
Lightwavel
Autodesk FBX的.dae格式
XSI 5的.xl格式
SketchUp Prol
3D Studio的.3ds格式
Wavefront的.obj格式
Drawing InterchangeFiles的.dxf格式
在下面的实例中,我们利用3D MAX来制作一个完整的动画,并导出FBX的格式给Unity3D使用。
第一步:创建新的工程文件。
创建一个名为&Turret&的项目文件夹。然后打开Unity3D软件,选择 498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="24" alt="6.JPG" src="/wyfs01/M01/08/1E/wKioJlF4kMWAWT1yAAADoZDpfwc794.jpg" id="aimg_67999" style="display:" /> &&& 498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="86" alt="7.JPG" src="/wyfs01/M00/08/1E/wKioJlF4kMXTU4WtAAAFjKLJOBg736.jpg" id="aimg_68000" style="display:" /> ,创建一个新工程项目,在项目路径中点击 498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="84" alt="8.JPG" src="/wyfs01/M01/08/1E/wKioOVF4kMXT95KkAAAF8bH_X4o182.jpg" id="aimg_68001" style="display:" /> 找到我们刚才创建的&Turret&文件夹,并点选我们需要导入的包文件,然后点击 498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="119" alt="9.JPG" src="/wyfs01/M00/08/1E/wKioOVF4kMXiRvzfAAAGrn7fEZ0875.jpg" id="aimg_68002" style="display:" /> 来创建一个新的工程文件。需要注意的是,以上步骤千万不能乱,因为Unity3D是无法以非空的文件夹作为工程文件夹来创建项目的。
在此为了节省时间,笔者直接使用刚才创建好的场景来进行示范。
第二步:制作一个炮塔模型。
打开3D MAX软件制作一个炮塔模型,并将制作好的模型保存在&Assets&【资源】文件夹下面。3D MAX中的模型样图如图8.1所示:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="558" alt="10.JPG" src="/wyfs01/M00/08/1E/wKioJlF4kMaworouAAA6wNA9MRM183.jpg" id="aimg_68003" style="display:" />
第三步:将炮塔模型放入场景。
重新来到Unity3D的软件环境中,这时大家已经能在Project【项目文件栏】看到我们刚才用3D MAX导出的模型文件和材质贴图文件了。接着我们在地形场景中找到一个合适的位置,将我们的炮塔拖拽进去。如图8.2所示:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="558" alt="11.JPG" src="/wyfs01/M01/08/1E/wKioJlF4kMbAPquGAACNGcm024M467.jpg" id="aimg_68004" style="display:" />
但是我们发现,这样似乎太小了一点。在改变外部模型尺寸的时候,有一个技巧,您不必在场景中修改它。儿科一道该模型的属性面板中去修改它的&Scale Factor&大小。如图8.3所示:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="345" alt="12.JPG" src="/wyfs01/M00/08/1E/wKioOVF4kMaghqLqAACvmrCblcU625.jpg" id="aimg_68005" style="display:" />
它的默认值都是0.01,我们在这里将它改为0.1,并在属性面板的最下方找到 498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="47" alt="13.JPG" src="/wyfs01/M01/08/1E/wKioOVF4kMaCbLGJAAAELzgU_p0480.jpg" id="aimg_68006" style="display:" /> 按钮,点击它让模型尺寸在Unity3D中得到改变。如图8.4所示:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="558" alt="14.JPG" src="/wyfs01/M01/08/1F/wKioJlF4kMbip2I3AACBDUvS67s546.jpg" id="aimg_67991" style="display:" />
怎么样,我们的炮台是不是雄壮了许多?但是,我们并不赞同这样的模型导入方法。因为根据官方的说法,他们建议您将做好的模型导出成为FBX格式的模型文件
给Unity3D使用。也许这样会使模型在Unity3D中的运行速度得以提高吧。所以说我们还是回到3D MAX的软件环境下面,将模型导出。
第四步:将炮塔模型导出。
MAX中,点击File【文件】&&&Export【导出】,将模型文件导出为FBX文件,保存到我们创建的文件夹中的&Assets&【资源】文
件夹下面。注意一下弹出的&FBX
Export&面板,这里包含了模型动画、骨骼工具、材质等等一系列的导出设置。如果您没有在模型中添加这些东西,就需要将不必要的复选框勾选掉。
第五步:将炮塔模型再次放置到场景中。
回到Unity3D的软件环境,在Hierarchy【层次清单栏】中选中原先的炮塔模型,按下&Delete&键将其删除。然后在Project【项目
文件栏】中找到刚刚导入的FBX模型,点击选中,用前面修改模型尺寸的方法来修改FBX模型的尺寸。然后将其放置在场景中合适的位置上。于是从3D
MAX中导出的模型就顺利的导入到Unity3D的场景中了。【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
Unity,也称Unity3D,是近几年非常流行的一个3D游戏开发引擎,跨
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
随着秋的到来,各路才子佳人渐渐开始回到学校上课。不
百度推出轻应用引起业界火热议论,收购91和推出轻应用
App搜索对应用的影响不容忽视,目前应用商店仍采用最
本书依据最新版《软件设计师考试大纲》的考核要求,深入研究了历年软件设计师考试试题的命题风格和试题结构,对考查的知识点进行
Windows Phone专家
Android开发专家
51CTO旗下网站Unity3D 通过代码导入自定义格式地形的方法 - 推酷
Unity3D 通过代码导入自定义格式地形的方法
最近有点空闲时间,就打算把以前项目的场景资源转移到Unity3D里面去,首先第一步做的就是地形的移植,在这过程中绕了不少弯路,专门记录下。
场景地形的移植首先想到的办法是通过高度图来进行中转,但由于Unity文档中对导入高度图的格式说明不够详细,试验了很多次都没能正确导入,最后只好作罢,转为直接通过c#脚本载入。
1) 导出。首先第一步是将地形的高度数据导出到文件中,由于这个文件等下读取的代码也是自己做,所以格式自己清楚就可以了,我是将每一个顶点的高度值以一个float依次保存在了一个二进制文件中。
2) U3D读取2进制文件。 现在我们有了存有地形高度信息的文件,接下来要做的事就是通过U3D去读取并解析这个二进制文件,这里我们通过TextAsset来载入。这里需要注意,需要通过TextAsset来载入的二进制文件,要将后缀名改为.bytes再加入到工程中。
3) U3D中地形的高度信息是保存在terrain.terrainData中的,起初认为只需要将读到的数据塞进去就可以了,后来发现也并非如此,主要存在下面几个问题:
HeightmapResolution的大小,也就是导入的顶点数据的多少,需要和你数据的大小对应,并且其大小应为2n +1。
U3D中地形所存储的数据并不是一个绝对的高度数值,而是一个相对的高度值,这个高度的分母应当是当前地形中最高值与最低值之间的差值。也就是这个值决定了这块地形的高度上限。对应的代码中的属性是terrain.terrainData.size.y。
U3D地形中是不存在负值的,如果你导入的地形数据中有负值,那么请将他们通过整体向上提升的方式,在保证相互之间高度的同时提升到0以上。
最后放上截图一张
具体的实现代码如下:
using UnityE
using System.C
using System.IO;
public class TerrainLoader : MonoBehaviour {
public string HeightDataF
public int MapS
// Use this for initialization
void Start () {
// 读取资源
TextAsset TA =
Resources.Load(HeightDataFile) as TextA
byte[] buff = TA.
buff[buff.Length-1] = 0;
float[,] data = new float[MapSize,MapSize];
int index = 0;
float min = 0;
float max = 0;
// 将二进制转换为float
for(int i = 0; i&MapS i++)
for(int j = 0; j&MapS j++)
data[i,j] = System.BitConverter.ToSingle( buff, index );
index += 4;
if(min & data[i,j])
min = data[i,j];
if(max & data[i, j])
max = data[i,j];
// 计算出地形最大值与最小值的高度差
float detailHeight = max -
// 设置地形的最大高度
terrain.terrainData.size = new Vector3(512,detailHeight,512);
// 将地形整体上移,消灭负值
for(int i = 0; i&MapS i++)
for(int j = 0; j&MapS j++)
if(min & 0)
data[i,j] = data[i,j] -
data[i,j] = data[i,j] / detailH
// 设置分辨率
terrain.terrainData.heightmapResolution = MapS
// 导入高度数据
terrain.terrainData.SetHeights(0, 0, data);
// Update is called once per frame
void Update () {
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 3dunity 导入max文件 的文章

更多推荐

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

点击添加站长微信