u3d制作的单机游戏保存后,下次重启u3d场景跟ui分离恢复,这个数据怎么存储?

刨根问底U3D---如何退出Play模式后保留数据更改 - Eran - 博客园
Blog Stats
Posts - 60
Stories - 1
Comments - 14
Trackbacks - 0
实际中遇到的需求
在做一款对抗类游戏,目前正在调整游戏的平衡性 所以就产生了一个需求 希望可以在Play模式时候对数据源做的更改可以在退出时候被保存下来。
举个Case, 比如 有一个炮塔 可以发射子弹, 然后有一组敌人 去攻击这个炮塔.
首先点击Play按钮 开始执行游戏逻辑
接着在Inspector中调整相应的数值,比如 射速啊,血量啊,敌人移动速度等等.
按原始的做法 就是调整以后 把所有的数据记录下来(截图或者写纸上)
点Stop进入编辑模式,所有数据回滚原始的 然后再一个一个把刚才改过的再重新填上去
一次两次还好,不过平衡性这东西 必然要经常调整 每次这样调整 非常影响工作效率,那有没有办法 可以让U3D在退出Play模式后保留对应的修改呢?
就此我还提了一个问题/question/37917 不过也没得到比较满意的答案 :(
只好自己瞎折腾了..
实现这个Case的思路
其实思路很简单, 因为 MonoBehaviour 有 void OnApplicationQuit (){} 函数 所以 在该函数内部 序列化相应的Class 然后保存到本地
当下次Awake 时候在反序列化 即可
1&从本地Load
2&反序列化
OnApplicationQuit
4&保存到本地
想法很简单 不过却遇到了不少问题..
LitJson 无法序列化float类型
LitJson 用的人应该很多吧,反正我自己一直在用,序列化首先就想到它了,不过JsonMapper.ToJson (this); 直接报错
JsonException: Max allowed object depth reached while trying to export from type System.Single
问答里面一个哥们儿说他那里没问题,我就Google了一下 发现也有几个人遇到了我同样的问题,并且我把所有float都去了 一切就都ok了
网上帖子里面是建议用doulbe然后再自己转换,想想实在太麻烦. 后来又在GoogleCode搜到一个自己改过的LitJson不过也觉得不好.
最后还是在GitHub上发现一个很NB的库
Full Serializer &/jacobdufault/fullserializer
代码结构很清晰 并且使用起来也很简单. 试了一下float的问题 完美Fix了. 这样第一个问题就算搞定了
MonoBehaviour 无法被New 出来
序列化的问题是解决了,不过反序列化时候就又有问题了.. 写好反序列化代码 然后运行 直接报Warning
You are trying to create a MonoBehaviour using the 'new' keyword.
This is not allowed.
MonoBehaviours can only be added using AddComponent().
Alternatively, your script can inherit from ScriptableObject or no base class at all
写的很清楚了, MonoBehaviour 不能用new,只能AddComponent, 并且直接序列化MonoBehaviour到JSON以后里面有很多乱七八糟的东西,比如gameobjct,transforme等等.. 所以看来这条路是走不通了.
嵌套类或Dictionary&string,object&
因为是希望Play时候可以在Inspector中编辑,但是同时又不能是MonoBehaviour(否则无法序列化) 所以想到的两个解决方法 一个就是用单写一个Vo类,然后在MonoBehaviour里面写get/set 方法
public class MetaManger:MonoBehaviour
class MetaVo
private MetaVo mVo;
public float Speed
get{return mVo.}
set{mVo.speed =}
这样做应该是可以的(抱歉我没有尝试),不过问题就是 每次新加入一个属性时候要相应的写get/set方法 很麻烦.
第二个方法就是 使用反射,在序列化时候把所有Property Add 到 一个Dictionary&string,object&里面 然后反序列时候再 反射还原。
理论上这个应该是可行的,不过反射弄起来很费劲 尤其是如果出现嵌套Array,枚举啊 什么这种不太普通类型时候.. 应该是个坑 果断放弃了这个思路
那有没有简单可行方法 来实现这个需求呢? 答案是有的(折腾了一天啊...), 不过在这之前 还是先了解一些知识(开始刨根问底..)
为什么U3D 在退出编辑时候无法保存数据?
Google了很多不过没有及时保存 已经找不到了 不过大体的意思就是
Unity会在Play时候 把当前所有所有的数据 序列化一份,然后在退出的时候再全部反序列化回去 就相当于RollBack了 所以 所有的改变自然都回去了.
[System.Serializable] 标签
这个也是我Google时候查到的,
在之前Case中 我也尝试过不对MetaVo的每个属性写get/set方法 就是在MetaManger中 直接public MetaV 这样Inspector中 无法看到
MetaVo中的内部属性,只能看到一个Vo,但是 如果对MetaVo加上了[System.Serializable]标签 则可以在Inspector中查到了
Google了一下 大部分人都是在复制粘贴 就说加上以后Inspector中就可以显示了. Ok 可是为什么呢?
首先来看下官网这篇文章 /Manual/script-Serialization.html(这篇文章写的很好,如果没读过的朋友建议仔细看看)
Inspector window. The inspector window doesn&t talk to the C# api to figure out what the values of the properties of whatever it is inspecting is. It asks the object to serialize itself, and then displays the serialized data.
个人理解的inspector组件的工作流程(未被证实,但是可以解释通)
我们先假设inspector是用js写的,脚本代码是用C#写的,底层U3D是C++写的. 序列化的方式采用JSON 那假象的交互流程就是
首先点击Play按钮
Unity通过momo 把C# 中的代码都序列化成JSON 保存在一块内存里面
inspector中读取这块内存中的JSON,然后反序列化成js中可识别的数据类型 接着显示在面板上面
用户在inspector中修改相应数据,inspector把修改的数据再序列化成JSON 放回那块内存里面
底层U3D代码 反序列化那个json到C++中可识别的数据类型,然后再根据相应的数值 操作场景上面的对象渲染
这个整个流程肯定是YY的 不过里面的逻辑我觉得应该是对的 就像文档中那句说的
Serialization of &things& is at the very core of Unity. Many of our features build ontop of the serialization system:
那整个又和[System.Serializable]标签有什么关系呢?
其实这个是因为,Unity只能序列化MonoBehavior和后面要提到的ScriptableObject 对于其他类型 他不知道这是什么东西 所以自然无法序列化了,无法序列化 自然也就无法在inspector中显示出来了
/oldman/articles/2409523.html 这篇也提到了我说的这个问题
有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。
当然U3D 自己的序列化中还有很多需要注意的,比如什么类型无法序列化,包括对于复杂类型如何写自己的序列化Callback函数. 我就不一一说了
/Manual/script-Serialization.html 这篇文章已经说的很全了.
第二个要说的就是ScriptableObject
Unity对于这种Vo数据类型的存储及序列化有着自己的解决方案 就是 ScriptableObject
/Manual/class-ScriptableObject.html
ScriptableObject is a class that allows you to store large quantities of shared data independent from script instances.
具体如何使用 可以参考
/gamedev/unity3d/unity-serialization-behind-scriptableobject//_archive.html/2012/02/unity-3d-scriptableobject-assetbundle.html
思路就是 首先通过编辑器先产生一个ScriptableObject类型的asset文件,然后在对应的把GameObject和这个文件Link起来. 具体的思路在解决方案二中有提及
有一点需要仔细理解一下 就是文档中提到的那个4MB 和 40MB 的例子 我个人认为 这个应该是ScriptableObject的核心。
ok废话就到这里 说两种我已经试验成功的解决方案
解决方案一
使用 [System.Serializable]标签 + Full Serializer。 这个方案应该很好理解 还是之前Case中的四步&
Full Serializer解决的是
无法序列化float类型的问题,[System.Serializable]标签 解决的是直接public MetaVo vo 无法在inspector中显示的问题
public class MetaManger:MonoBehaviour
[System.Serializable]
class MetaVo
public MetaV
(抱歉 代码没有试 感觉应该可以,因为我实际的代码 要涉及到单例 以及个个Serializable的类嵌套 比较复杂 无法直接贴上来)
只要把MetaVo 前面加上[System.Serializable]Tag 即可 目前实际项目中 使用一切都Ok ,其中包括
1`对于 [System.Serializable]内部嵌套另一个 [System.Serializable] 的 类, inspector中显示OK 并且有折叠 编辑起来很舒服
Full Serializer序列化和反序列化也Ok 毕竟这只是普通类而已..
2`类中包含有枚举类型,inspector显示ok ,Full Serializer 序列化也ok 并且序列化后的JSON中枚举类型被转化为String,这样即使以后枚举中有增删改 照样可以反序列化回来 不知道LitJSON是不是 没有试过
解决方法二
第一种方案 其实是挺正统的一种方法,就是 做一个单例的MetaManger 然后所有的实例对象 比如炮塔啊 子弹啊 敌人啊 当需要相应数据时候 向MetaManger中去要.
不过 用ScriptableObject的特性 可以用另外一种方式 来做.
把刚才的例子变得复杂一些, 炮塔变成 红黄两种, 炮塔属性相同 都只有一个speed,和damage项需要配置 此时可以
1& 写MetaClass
public TowerMeta:ScriptableObject
2& 执行命令生成两个asset 一个交 RedTowerMeta.asset, 一个叫 YellowTowerMeta.asset
3& 写TowerRender类
public TowerRender:MonoBehaviour
public TowerM
4& 在场景上建立 红黄两个塔实例,然后分别对应拖入RedTowerMeta.asset和YellowTowerMeta.asset并存成两个Prefab
5& 用代码或者直接拖拽都行,在场景上 建立10个红塔 10个黄塔
6& 点击Play按钮 然后 点击 Hierarchy中的RedTowerMeta.asset或者YellowTowerMeta.asset 此时 Inspector中 应该可以显示出来对应的数值的, 并且可以直接更改 即使退出Play模式以后不发生回滚
这里其实就是用了ScriptableObject得特性, 即使产生了10个红塔 10个黄塔 但是他们引用的Meta(ScriptableObject) 是同一份.
方案一和方案二的优劣性
方案一 最终生成的是JSON,优势是明文可读 项目大了以后 可以单独写编辑器解析对应JSON 进行编辑适配。劣势 就是JSON体积大 体积大 需要自己压缩.
方案二 优势是生成的asset是被压缩过的体积小,并且和Unity配合很紧密 一切托托拽拽即可 也不用管初始化 每个类Start()以后直接取用就好劣势 就是一个是要写命令产生对应的asset 第二个就是 如果数据格式发生变更 比如 TowerMeta中加入新的属性 int cost ,那之前的asset就不能用了
因人而宜吧,我个人是比较倾向于 [System.Serializable] + Full Serializer 操作起来很方便 :)
Ok 就叨唠这么多好了用于场景恢复的函数_QuickTestPro_领测软件测试网
用于场景恢复的函数
发表于:来源:Csdn作者:tulituqi点击数:
在制作场景恢复的时候可以选择调用函数来解决,下面的函数就是为此写的。因为之前用的场景恢复只报错了,看报告后大概了解了Object、Method、Arguments、retVal等参数的意义
  在制作场景恢复的时候可以选择调用函数来解决,下面的函数就是为此写的。因为之前用的场景恢复只报错了,看报告后大概了解了Object、Method、Arguments、retVal等参数的意义,于是写了这个方法,一方面可以截图,另一方面可以在报告中看到哪个对象出问题了。因为我经常是通过公司的平台调用案例,一般晚上或凌晨执行,第二天看结果,看结果的时候一般直接从打开报告查看,这样方便自己定位问题。
  这个方法的作用我简单描述一下:首先是指定一个目录,然后检查是否从QC调用的(因为有时候自己单机执行也用到这个),如果是就记录测试集的名称,如果不是就放到SingleTest目录,然后判断对应的目录是否存在,不存在就创建目录。之后是创建日期时间标签,然后把文件完整路径组合起来,并加上了案例名称,测试机器等等(因为有很多台机器,方便查看是否某台机器出问题了)。之后模拟2次回车按键是防止有异常对话框存在,然后把原来的对象语句自己还原回来,这样如果是某个对象执行什么操作的时候语句出错,就可以在报告里看到了。
  当然并不是很完善,比如时间标签的分秒没有加0的判断,Arguments其实是个集合,只不过我只考虑了1个的情况,没考虑多个的情况。
  需要用这个的朋友可以自己稍微维护改进一下。使用方法就是自己创建一个场景恢复,然后选择指定文件里的函数,下面的函数最好单独保存为一个文件,因为我之前把他和我的函数库放在一起,发现里面的初始化函数被执行了2次,可能和场景恢复有关,分开后就没问题了。
  [] view plaincopyprint?
  '用于恢复场景控制。
  Function RecoveryFunctions(Object, Method, Arguments, retVal)
  '有错误发生时,对Desktop进行截图并保存
  ' SaveTestError &&
  Set objWS = CreateObject(&WScript.Shell&)
  strDesktopFolder = &T:/TestData/测试组/测试截图/&
  If QCUtil.IsConnected then
  If TypeName(QCUtil.CurrentTestSet) && &Nothing& Then
  set CurrentTSTest = QCUtil.CurrentTestSet
  strDesktopFolder = strDesktopFolder & CurrentTSTest.Name '如果从QC的测试集运行的,则保存到测试集名字的目录下
  strDesktopFolder = strDesktopFolder & &SingleTest& '如果不是从QC运行,保存到SingleTest目录下
  End If
  strDesktopFolder = strDesktopFolder & &SingleTest&
  End If
  Set objFSO = CreateObject(&Scripting.FileSystemObject&)
  If objFSO.FolderExists(strDesktopFolder) Then
  Set objFolder = objFSO.GetFolder(strDesktopFolder)
  Set objFolder = objFSO.CreateFolder(strDesktopFolder)
  End If
  '确定保存文件的名称
  tmpTime=Time()
  t=Split(tmpTime,&:&)
  If Len(t(0))&2 Then
  t(0) = &0& & t(0)
  End If
  tmpTime=t(0) & t(1) & t(2)
  tmpDate=CStr(Date())
  tmpYear = CStr(Year(tmpDate))
  tmpMonth = CStr(Month(tmpDate))
  tmpDay = CStr(Day(tmpDate))
  '如果月或日不足两位,前面补0
  If Len(tmpMonth) & 2 Then
  tmpMonth = &0& & tmpMonth
  End If
  If Len(tmpDay) & 2 Then
  tmpDay = &0& & tmpDay
  End If
  tpmDate=tmpYear & tmpMonth & tmpDay
  ' strTimeStamp = CStr(Year(Now)) & CStr(Month(Now)) & CStr(Day(Now)) _
  ' & &_& & CStr(Hour(Now)) & CStr(Minute(Now)) & CStr(Second(Now))
  strTimeStamp = tpmDate & &_& & tmpTime
  strFile = strDesktopFolder & &/[测试案例]& & Environment(&TestName&) & &_[测试机器]& & Environment(&LocalHostName&) & &_[测试时间]& & strTimeStamp & &_Error.png& '组合出截图文件的名称
  '对Desktop截图并保存
  Desktop.CaptureBitmap strFile
  reporter.Filter = 0
  Reporter.ReportEvent micFail,&案例失败&,&本处提交失败报告是为了避免下面因为数据问题导致错误报告没有正常提交。&
  reporter.Filter = 3
  set WshShell = CreateObject(&WScript.Shell&)
  WshShell.SendKeys &{ENTER}&
  WshShell.SendKeys &{ENTER}&
  strStepInfo = &Test(& & Environment(&TestName&) & &)-Action(& & Environment(&ActionName&) & &) 发生非预期错误,测试退出&
  ' strDetails = &错误编号:& & CStr(Err.Number) & &,错误描述:& & Err.Description
  On Error Resume Next
  oClass=Object.GetTOProperty(&milass&)
  oName=Object.GetTOProperty(&name&)
  reporter.Filter = 0
  Reporter.ReportEvent micFail, strStepInfo, oClass & &(& & Chr(34) & oName & Chr(34) & &).& & Method & & & & Arguments(0) & & 出现错误,错误编号:& & retVal
原文转自:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
绘画、动画、游戏、CG技术研究爱好者,非权威高手。博客文章自由共享,转载时请保持内容完整。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
(个人理解,仅供参考)
Unity3D,简称U3D,是德国UnityTechnologies公司所开发的中端游戏引擎。U3D相对于虚幻3引擎,只能算是小弟级的游戏引擎,但是它在游戏制作上的高效率,以及对应多平台的游戏开发,使得它在国外的独立游戏制作小组中具有很高的人气。
U3D的免费版和专业版的区别主要在于画面滤镜和底层类库的使用权限,U3D免费版也是能制作完整游戏的,并且可以发布PC,MAC和Web平台的游戏,移动平台(IOS,Android)和次世代游戏机平台(PS3,XBOX360,Wii)则需要另外的授权。*Unity3D的开发公司和Adobe公司合作之后,从3.5版本起,U3D增加了Flash的发布功能(需另外授权)。
U3D借鉴了虚幻引擎和一些大型三维动画软件的操作理念,因此很容易入门,并且它和其他软件的协作会很便捷。U3D的软件界面布局很完善,用户可以快速的选择一个适合自己开发习惯的窗口排序。
*如果要和三维动画软件做对比的话,我觉得U3D就像是Maya的软件操作,3dsMax的功能执行,C4D的菜单管理。
新建一个工程目录时,为了提高场景载入速度,U3D默认是不加载资源包的。因此用户可根据自己的工程所需,选择相应的功能包。例如内置的角色控制系统,地形组件,天空盒,画面滤镜,脚本集等。
U3D的工程目录作为资源存放的系统文件夹,可随时更新和调用,相对于UDK必须提前导入引擎包的形式,U3D更为人性化。我们可以在U3D的工程目录管理窗口中直接建立文件夹,用来对资源进行存放和分类,例如:scripts(脚本),materials(材质),meshes(网格),scenes(场景),textures(贴图)等。U3D的文件会自动排列,为了保持我们建立的目录次序,我们可以在文件名前加入下划线,如:_ script,_material。
U3D可以建立一些基本的几何体,但是你不能执行建模操作,只能对他们进行一些简单的整体变形,所以多数的图形元素,我们需要从外部导入。虽然U3D中可以创建并绘制地形,不过若非很平坦的地形,对于起伏强烈的山地,使用maya创建会更理想一些,因为涉及到贴图拉伸的问题。* U3D目前还无法改变模型的轴心点,因此需要在三维软件中事先完成设置。
U3D的场景单位是米,而maya是厘米,因此软件的数值上maya需要设定为100倍,才能和引擎中的场景比例匹配。例如,一个引擎中1.7M高的角色,在maya中的高度应该是170单位(厘米)--也可以在导出FBX文件的时候再设置单位,或者在U3D中调整FBX文件的ScaleFactor属性。当然,用户也可以自行更改maya的默认单位,不过个人不推荐那么做,因为除了动力学方面的影响,建模时的一些默认数值将会变得巨大(例如Bevel倒角功能)。*U3D虽然单位是米,但是它默认的ScaleFactor参数是0.01,也就是对应的是maya中厘米;如果在Maya中使用了米为单位,导入U3D中时,还需要手动将ScaleFactor设置为1。
虽然U3D支持导入Maya特有的ma,mb或者3dsMax的Max格式文件,但是读取会很慢,因此最适合U3D的外部导入3D文件格式是FBX。当将FBX文件放于U3D工程目录时,U3D会自动读取FBX中包含的模型材质,并归于一个独立的文件夹Materials中。要注意,在U3D中拖拽贴图到材质球和点击材质球贴图方框内的select按钮是不一样的,前者会不断的生成独立的纹理增加文件量,而后者则是共用一个纹理。*U3D3.X还无法对多个物体同时赋予相同的材质,因此在导入U3D前,我们应该在Maya中将材质分类好;还要注意模型面的法线朝向,尽量不要出现反面。提示:Unity4.X版本之后可对多个物体同时赋予材质。
当把prefabs预置物放入场景中,会自动形成一个类似maya渲染代理一样的几何体,修改这个几何体的属性后,点击Revert可以返回初始状态;如果点击Apply,会直接应用到工程目录的prefabs中,所有场景中的prefabs都会同时改变,因此要慎用。
Skybox天空盒的创建。游戏中的天空,就是一个包裹场景的几何体贴图。对于游戏引擎,是六张覆盖立方体六个面的无缝天空纹理。U3D的天空盒需要和摄像机或者在渲染设置中进行关联。*渲染设置中加入天空材质,可以直接在场景中看到效果;摄像机中连接天空盒,只有执行游戏渲染时,才会在特定摄像机中看到。
U3D中有四种类型的灯光:PointLight,Spotlight,DirectionalLight,AreaLight,AmbientLight。其中,AmbientLight不是独立的灯光元素,而是位于渲染设置中,可对场景中的背光进行色彩调节(通常是冷色系),用于模拟环境反射光(多为天光)。方向光常用于模拟阳光,灯光的所在位置不影响照明效果,因为它是基于朝向的。
目前U3D的光照系统和场景构建元素还没有UDK(虚幻引擎开发套件)那么丰富,因此图形的渲染效果上自然没有UDK出众,不过它已经足够用来开发画面强劲的次世代游戏,移动平台和网络游戏更不在话下。
renderPass渲染通道。在U3D中有三种重要的渲染通道,都是基于灯光材质产生的。目前U3D还没有实现类似maya或者UDK那样可对材质着色通道进行纹理动画连接的功能,因此用户需要自行编写材质,这在一定程度上限制了创意的发挥。
lightmass质量的设置直接决定着游戏品质。场景中的灯光和阴影是实时计算的,这不会应用于游戏中,游戏会通过灯光贴图和阴影贴图来提高画面的运行效率。对于场景中静止的物体,我们可以采用各种全局光照明来将灯光效果烘焙到模型对应的贴图中,这有两种方法:一种是在绘制模型贴图时,通过三维软件的全局光系统(如FG最终聚集,GI全局照明),将灯光效果烘焙;另外就是直接在游戏引擎中烘焙(依赖于引擎的功能)。U3D的灯光系统并没有UDK那么强悍,尤其在全局照明效果上。
OcclusionCulling是U3D中用于优化场景显示效率的一个功能,可以很大的降低游戏对系统资源的消耗。它的原理是不绘制在摄像机范围内看不到的被遮挡物体。*U3D可以针对web和移动平台做到很大的资源优化,这点是UDK不能比的。
U3D支持多种语言编写脚本:C#,JavaScript,Boo。JavaScript脚本较容易上手,常作为初学者或JavaScript编程人员的首选,不过从长远的扩展来看,C#则是用户最佳的选择方案。当然,你也可以在一个游戏设计过程中,同时使用几种语言的脚本进行组合,因为U3D最终都会将这些语言转为它内置的编译语言。*JavaScript不是Java。
Unity3D具有广阔的发展前景:通用的软件操作规范,高效的开发速度,多平台的支持,以及广泛的编程语言的兼容。
阅读(82299)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'【U3D】Unity3D的基础认识',
blogAbstract:'
(个人理解,仅供参考)
Unity3D,简称U3D,是德国UnityTechnologies公司所开发的中端游戏引擎。U3D相对于虚幻3引擎,只能算是小弟级的游戏引擎,但是它在游戏制作上的高效率,以及对应多平台的游戏开发,使得它在国外的独立游戏制作小组中具有很高的人气。
U3D的免费版和专业版的区别主要在于画面滤镜和底层类库的使用权限,U3D免费版也是能制作完整游戏的,并且可以发',
blogTag:'unity3d,u3d,maya',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:3,
permalink:'blog/static/',
commentCount:2,
mainCommentCount:1,
recommendCount:7,
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:'绘画、动画、游戏、CG技术研究爱好者,非权威高手。博客文章自由共享,转载时请保持内容完整。',
hmcon:'0',
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}}

我要回帖

更多关于 u3d场景资源 的文章

更多推荐

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

点击添加站长微信