testads1

2016年4月20日星期三

Unity3d Asset Server启动问题

周末机房停电后asset server无法启动,点击启动出现“asset server could not start server”。
几经周折,找到原来是用户问题,解决办法如下:
1、命令行输入“compmgmt.msc”
2、在“本地用户和组 -> 用户 -> unitysrv”右键打开属性,去掉“用户下次登陆时须修改密码”,选中“密码永不过期”
3、重启启动Asset Server服务。

2016年4月4日星期一

Unity进阶技巧 - 从文件读取游戏数据

游戏程序
平台类型: 
程序设计: 
编程语言: 
引擎/SDK:Unity3D/2D 



Unity进阶技巧 - 从文件读取游戏数据

  GameRes游资网授权发布 文/Zui的简书

  在游戏制作中,我们的许多数据都是需要从文件里面读取,比如常用的装备数据,怪物数据,关卡数据等
等,所以如何从文件中读取这些数据就变得尤为重要,因为将游戏数据放入文件中,会大大提高我们制作和调
整游戏的效率,所以本例中我们来看看Unity中如何通过CSV文件来读取游戏数据。

  你将学到什么?

  • 使用Numbers制作CSV数据文件
  • Unity基础的文件读取
  • 通过行数和列数获得指定的数据

  一、制作CSV文件

  一般情况下,制作游戏数据会用到表格软件,windows下常用Excel,而Mac下常用Numbers,而这两种软件都可以导出我们本例所需要的文件——CSV文件。

  首先我们打开Numbers,新建一个文件,

Unity进阶技巧 - 从文件读取游戏数据
 新建一个Numbers文件

  然后输入我们需要的内容,如下:

Unity进阶技巧 - 从文件读取游戏数据
表格内容

  这就简单的制作了一个装备数据表,每件装备我们假设它有5个属性:

  • id:装备ID,具有唯一性
  • name:装备的名字
  • level:装备等级
  • attack:装备增加的攻击
  • def:装备增加的防御

  数据填写完之后,我们就可以选择文件->导出到->CSV…

Unity进阶技巧 - 从文件读取游戏数据
导出CSV

  然后在弹出的对话框,直接点击下一步:

Unity进阶技巧 - 从文件读取游戏数据
下一步

  然后在接下来的对话框中,选择文件名和保存路径:

Unity进阶技巧 - 从文件读取游戏数据
选择文件名和保存路径

  导出后,我们找到myTest.csv文件,打开可以看到:

Unity进阶技巧 - 从文件读取游戏数据
myTest.csv文件内容

  我们可以看到我们刚刚制作的表格数据都被以文本的方式保存下来了,并且使用了“,”号来进行分割,而CSV的中文翻译就是逗号分隔值。但是我们会发现一个问题,为什么后面会多了那么多逗号呢?那是因为我们导出的时候没有将空的单元格删除掉

Unity进阶技巧 - 从文件读取游戏数据
都是空单元格的错

  所以我们导出CSV文件是,记得要删除掉那些空的单元格,如下图:

Unity进阶技巧 - 从文件读取游戏数据

  删除空单元格后的表格,

  然后我们再导出一次,并打开导出的文件查看,就会发现那些多与的逗号没有了。

Unity进阶技巧 - 从文件读取游戏数据
终于正常的CSV文件

  二、读取CSV文件

  有了CSV文件后,下一步就是将它放入Unity中,并让Unity读取里面的数据,首先我们新建一个Unity工程,然后将我们刚刚创建的CSV文件放入Unity的资源目录下,本例中我们选择放入在*Asset->Res文件夹下面(Res文件夹需要大家自己创建)

Unity进阶技巧 - 从文件读取游戏数据
CSV文件放在Unity中的位置

  然后我们新建一个名为CSV的脚本,打开进行编辑,输入一下代码:

Unity进阶技巧 - 从文件读取游戏数据
完整的代码

  首先,如果我们要使用Unity的读取文件的方法,需要在开头引入System.IO的命名空间,这样编辑器才会识别读取文件的一些方法。

  然后我们还需要使用List类型的变量,所以还要引入System.Collections.Generic的命名空间

  然后这个CSV类是我们自己定义的一个静态类,不需要继承MonoBehaviour类,所以我们把继承MonoBehaviour类的语句删除掉。

  接着我们定义了csv和m_ArrayData两个成员变量,第一个用来实现单例模式,第二个用来保存从文件读取的内容。

  然后使用单例模式来生产这个类的实例,以后需要使用这个类的方法我们就通过GetInstance来获取这个类的实例。

  接着我们在构造函数CSV()中,初始化m_ArrayData。

  然后我们定义了loadFile方法,有两个参数,第一个是路径名,第二个是文件名,通过路径名+文件名我们就可以指定我需要读取的文件了。

  接着看看loadFile这个方法里面到底做了什么事情?首先每次读取文件前,我们清空一下m_ArrayData,以免数据冲突。

  然后我们定义了一个StreamReader类型的变量sr,用他来保存文件读取后的最原始的数据。

  然后我们使用try{} catch{}语句,来捕获程序异常,这个逻辑和if语句有点想,如果我们文件读取不成功,就会运行catch里面的语句,在后他打印一句话来通知我文件没有找到,在try{}里面使用OpenText方法来打开我们的myTest.csv文件

  接着我们定义了一个line,用来临时保存sr里面的每一行数据

  然后使用一个while循环,把sr里面的数据按照一行来切割,全部放入m_ArrayData中

  最后使用close和Dispose函数将sr进行关闭和销毁。

  写完代码,保存一下,然后我们在创建中新建一个空的GameObject,命名为FileController,并且为挂载一个新的脚本文件FileController,用来控制文件的读取。

Unity进阶技巧 - 从文件读取游戏数据
FileController

  然后打开FileController脚本,输入下面的代码:

Unity进阶技巧 - 从文件读取游戏数据
完整的代码

  首先我们在Start函数中,通过CSV的实例调用loadFile方法来读取我们的myTest里面的内容,loadFile方法有两个参数,一个是路径名,一个是文件名称,关于路径名的一些注意事项,会在后面的扩展阅读里面介绍,这里只要理解我们通过路径名+文件名就可以指定需要读取的文件了

  然后我通过for循环,将m_ArrayData里所有的内容打印在程序后台中

  写完代码,保存一下,然后回到Unity编辑器,运行游戏,可以在后台打印中看到如下数据:

Unity进阶技巧 - 从文件读取游戏数据
后台打印的数据

  可以看到,现在我们已经可以读取到文件里面的内容了,并且是可以分解每一行的内容分别是什么,但是这样的解析程度还远远不够,不能为我们所用,假设我们游戏中需要生成一件装备布衣,我们需要通过文件获
得布衣的每一个属性,如布衣的等级,增加的防御值等属性,我们就需要将每一个数据单独提取出来,所以我
们需要可以指定获得某一个单元格里面的数据才行,下面就来看看怎么实现

  三、根据行数和列数来指定获取数据

  现在我们的m_ArrayData里面存放的是一行的数据,也就是说其实m_ArrayData[0]就是取我们第一行的数据
,m_ArrayData[1]就是取我们第二行的数据,那么接下来我们只需要再进行一下解析,将每一行的数据按照列
数来拆解,这样我们就可以通过行数+列数来确定指定数据了,先直接上代码:

Unity进阶技巧 - 从文件读取游戏数据

  由于这次我们需要将每一行的数据按照列数来拆解,那么m_ArrayData里面装的元素就不再是string了,而是一个string数值,所以我们这边需要修改m_ArrayData的类型为List<string[]>。

  然后我们新增一个方法getString,它有两个参数,row是行数,col是列数,方法返回指定行数和列数的数
据,数据类型是string。

  同时我们还增加一个方法getInt,它也有两个参数,row是行数,col是列数,方法返回指定行数和列数的数据,数据类型是int,所以最后调用了int.Parse方法将string转换成int类型。

  最后我们修改while循环中的讲数据添加到m_ArrayData的语句,这里我们调用Split方法,将数据以 “,” 作为分隔符,切割数据。

  写完代码,保存一下,然后我打开FileController脚本,修改代码如下:

Unity进阶技巧 - 从文件读取游戏数据
完整的代码

  首先读取文件的语句和之前一样。

  接着我们调用getString方法打印行数为1,列数为1的数据。

  最后我们调用getInt方法打印行数为1,列数2的数据。

  写完代码,保存一下,大家可以先思考一下,上面打印的两个数据分别是上面内容,然后在运行游戏,检查一下实际结果是否和你想象的一样

Unity进阶技巧 - 从文件读取游戏数据
具体对应的数据

Unity进阶技巧 - 从文件读取游戏数据
打印结果

  扩展阅读

  前面我们提到过,关于文件路径的存放位置,在本例中我们使用了Application.dataPath来指定路径位置,关于路径有4个类型:

  Application.dataPath:该路径指向我们Unity编辑器的Asset文件夹

  Application.persistentDataPath:该路径指向iOS和Android的沙盒路径

  Application.streamingAssetsPath:streamingAsset文件夹路径,在任何平台都可以通过这个路径读取到文件夹里的内容

  Application.temporaryCachePath:临时数据文件路径

  关于这4种路径的详细地址,大家可以试着在Unity里面用Debug.Log语句将其打印出来,看到完整的路径会
便于理解。

2016年3月26日星期六

A*寻路——多人寻路

之前两篇▶A*寻路——基础入门与战术寻路、▶A*寻路——跨层寻路和大家分享了一些A*的简单的用法和例子,这次分享下A*的多人寻路的做法,也算是A*的完结篇。

在我们玩魔兽或者红警的时候,我们经常会做的一个动作就是拖动大量人物,然后进行一些移动操作,这时被我们选中的人物会排好队依次前进,到达我们指定的地方。我们作为一个游戏设计者需要控制组成小队的多个AI角色,那么现在我们看看A*能做成什么样的效果。

首先我们从性能上分析,A*寻路要求的计算量是比较大的,很难在一帧之内完成,如果还是同时为一群AI寻路,A*寻路就会显得比较吃力了。

对于这样的情况,一种可能的解决办法是将A*寻路和之前说的群体操控行为结合,选择一个AI作为领队,用A*寻路算法为这个单元计算路径,然后队伍其他单位只要利用跟随领队行为,以及分离,聚集,队列和避障这几个组行为结合就可以了,这样不仅降低了寻路的计算量,而且群体看起来比较真实,也不会互相拥挤碰撞。
但是如果小队的规模比较大,或者地形很复杂,有好几层的话,这个解决方案不一定能正常工作,这时我们可以采用另外一个方法,就是为每个单元的目标位置都加上一个偏移量,这样我们的小队单元接近目标的时候,就不会互相拥挤或者碰撞,好,那我们开始!

我们分析好思路,那现在我们就从以下几个方面开始考虑

集群系统:小队的每个单元需要协同移动,所以我们要编写让他们以这种方式移动的逻辑

雷达: 用来寻找周围的队友,如果距离过近就产生一个排斥力。

寻路与避开障碍:让那个单元找到一条路径,而且需要避开中途的障碍物。

目标点:如果全部单元的目标点都是同一就会产生堆叠和碰撞,所以我们需要为小队的每个单元生成不同的目标点,这样就不会互相堆叠起来。
   
首先新建个场景,添加Obstacles,Ground层。然后创建一个平面将Layer设置为Ground。然后添加一些墙体做障碍物,将Layer设置为Obstacles。

然后创建一个空物体命名为A*,选择GridGraph,设置好相应参数,扫描,建立基于单元的导航图。最后创建一个目标点预制体,创建一个空物体,命名为MyDestination,添加rigidbody,然后添加一个Destination.cs脚本,这个预设物就作为我们双击鼠标在目标点后产生的AI移动的目标点。

然后放到Project目录,后期自动产生。
然后,我们设定一个目标点,当我们双击鼠标,就在鼠标点的地方产生一个目标点,如果我们小队中全部成员都向这个目标点移动的话,那就会产生拥挤火堆叠,所以我们改成以原目标点为中心,为小队中每个成员寻找原目标点周围的位置作为寻路目标,我们来开始新建一个脚本Destination.cs  用来实现给目标点周围添加角色移动的点。

我们创建一个空物体,命名为myDestination ,把脚本拖上去,然后放到Project面板保存起来,下一步在创建一个目标位置管理器,创建一个空物体,名称为Manager,再添加一个DestinationManager.cs 脚本。




然后我们把刚才创建的myDestinationPrefab 拖到Manager的DestinationPrefab位置中,然后我们把人物拖入场景,命名为EnemyAI  ,加入CharacterController角色控制器组件,调整好位置,在添加Seeker组件 Component-Pathfinding-Seeker , 再添加Boid脚本,为了能平滑移动,在单击component-Pathfinding-Modifiers-SimpleSmoothModifier  加入一个平滑脚本,设置好AI后,我们复制多几个出来,让他们组成角色小队。
我们需要实现群体中个体之间的协调运动,至少需要两种行为:聚集(用于产生将单元聚集一起的力)和分离(用于产生单元之间彼此分离的力),使他们不至于撞到一起。

然后我们还需要一个状态奇,为小队单元设置3种运动状态,Idle闲置,Moving移动和Organizing组织。

在Boid.cs脚本中,实现了"邻居检测雷达",使每个单元都可以知道在一定半径内是否有其他单元,而为了实现这个目标,我们使用Physics.OverlapSphere函数来探测周围碰撞体,但是这个函数的性能开销比较大,所以我们使用一个协同来运行。

寻路也在这个脚本实现,我们继续使用A*,当计算好集群行为的操控力和路径时,需要把他们结合到一起,并且作用于角色控制器,在Update函数中应用这些力并进行位置更新。下面是Boid.cs代码:







好了,到这里就基本差不多了,我们运行工程,随便双击一个地方,就可以看到小队一起移动到我们要去的目的地了。
而且过程中不会发生太大的拥挤,如果我们取消A*,改用我们unity自带的寻路其实也是可以的,非常适合手游MMORPG方面的一些团战AI,对了,如果大家在制作的过程中,如果发现人物会到处乱转上下不停抖动,那极有可能是角色控制器范围太大造成的,AI和AI之间发生拥挤,这时候把碰撞器的范围缩小就搞定了。









2016年3月21日星期一

盘点2015 | Unite 2015 技术精品课程回顾



Unite是Unity倾力打造的一年一度的开发者盛会,Unite 2016将移师上海举办,时间是4月10日到12日!大会门票正在火热发售中,Keynote门票限时免费!把握机会,点击原文立即报名参加吧!

今天我们将为大家盘点Unite 2015大会上最受开发者欢迎的精品技术课程!希望大家能从中获益!

点击课程标题可跳转至具体课程页面,建议在WIFI环境下观看!



1
Unity项目架构设计与开发管理
本课程讲解了Manager of Managers的概念,详细介绍LevelManager,PoolManager等开发方式,有助于培养开发者项目开发和管理中的规范。并介绍了如何使用Strangeloc和UFrame这两个Asset Store上的精品插件,从而为项目提供更加标准的管理模式。本次课程会让你对开发管理有更多新的领悟!


2
Unity资源的优化管理
AssetBundle是Unity提供的一个强大的资源打包、更新系统,但是在使用的过程中需要特别小心资源的依赖关系,否则可能导致资源的重复和冗余。这个课程主要内容是介绍Unity 4.x下的一个AssetBundle依赖关系打包算法,可以全自动的完成AssetBundle的依赖关系打包,可以避免手动处理导致的繁琐工作,以及可能出现的操作失误。

3
Unity 5 图形系统介绍
《 Unity 5图形系统介绍》重点介绍了Unity 5中PBS(基于物理的着色器)与GI(全局光照)。PBS介绍了相关原理,编辑器以及Shader编写及使用,Reflection Probe等。GI介绍了Lighting面板的使用,强调了在制作过程中比较容易出问题的Realtime和Bake GI等。如果你在场景搭建的过程中遇到相应问题,或许可以从该课程中寻找到想要的答案。

4
Unity 5 的新AssetBundles打包功能
AssetBundle作为Unity进行资源压缩和加载的重要工具,是每一位Unity开发者必须掌握的。本课程重点介绍了Unity 5中新版本的AssetBundle功能。

Unity MVC框架 StrangeIoC

       StrangeIoC是一个超轻量级和高度可扩展的控制反转(IoC)框架,专门为C#和Unity编写。

MVCS工作图:
官网文档对自带的示例进行了详细介绍,可以看一看。

Unite 2016 | 国内技术专场议题提前曝光(下)

一年一度的开发者盛宴——Unite大会,离我们越来越近了!我们已经提前曝光了国内技术专场上半部分的内容,今天为大家介绍下半部分。

看看下面的课题哪些是您最感兴趣的?

1
Asset Store精品案例推荐
介绍Asset Store上的优秀插件。其中包括:
-ProBuilder,一个快速的场景创建工具,提供非常实用的建模工具,开发者可快速创建自己的场景;
-Pro Camera 2D,专业的摄像机跟随系统,提供多种多样的摄像机在2D平面上的跟随方案,非常适用于2D卷轴游戏;
-Easy Save,一套完善且专业的数据读存取方案,支持多种Unity内置数据类型;
-Rewired,一套高级可视化的输入定制系统,开发者只需少量的代码就可以实现多玩家输入。 

2
Unity项目管理设计
项目管理是一个重要且持续的过程,因为游戏开发具体涉及程序逻辑实现,美术资源作制作,策划文案书写,部门人员沟通等复杂内容。尤其对于Unity项目来说,各种资源分类及访问都会直接影响到项目开发的效率。所以在项目之初对项目整体结构有个大体设计是至关重要的。

3
Unity Ads:为你获得更多盈利
该课题介绍移动游戏视频广告的全球趋势,让用户更加了解如何正确使用Unity Ads 的服务。在本次课程上,Chris会通过Rovio和SEGA等成功案例,为大家分享最佳的广告集成策略以及教授您如何将游戏与广告完美融合。

4
GPU Instancing 技术简介
简单介绍GPU Instancing的原理和应用场景,并实际演示如何通过修改Shader来利用Instancing技术减少Draw Call数量。游戏内资源过多场景过大都是导致运行效率低下的原因,而此课题能够帮助大家深入理解背后的原因以及可以采取的优化办法。

Unite 2016 | 国内技术专场议题提前曝光(上)

一年一度的开发者盛宴——Unite大会,离我们越来越近了!本次大会上,来自国内外的Unity官方工程师以及业界知名的技术大牛,将为大家带来更前沿更尖端的技术分享,让大家全方位深入了解Unity引擎的强大功能以及各领域的相关应用。
今天我们将为大家揭晓本次Unite大会的国内技术专场的部分内容,看看哪些课题你最感兴趣呢?

1
Unity 5.x Editor新功能介绍
Unity 5发布以来,编辑器内又陆续加入了一些全新的功能。该课程将为大家介绍其中几个实用且有特色的功能,包括图形调试工具Frame Debugger,自动化测试工具Test Runner和新的内存调试工具Memory Profiler等。
2
Mecanim新功能讲解
Unity新的Mecanim动画系统自从发布以来又陆续加入了一些新功能,帮助开发者创造更为真实的动画效果。该课程将详细讲解Unity 5.0发布之后,新增的State Machine Behaviors,Random Nodes,Procedural States等功能特性。
3
多场景编辑
Unity 5.3中开始支持多场景编辑功能。本课程将介绍该功能的基本使用方法,进而介绍一些相关的底层实现逻辑,并将介绍该功能的应用场合以及一些使用技巧。
4
Shader使用技巧与案例分析
介绍Unity中shader的使用技巧,创建一些高级的视觉效果。介绍多种游戏中常用的视觉效果的制作原理及方法,如透视效果、卡通渲染等,并通过具体的案例来具体分析shader的编写方法及技巧。
5
Multiplayer And Networking
深入讲解Unity引擎全新的Multiplayer Networking系统,有助于开发者尤其是独立开发者快速开发多人在线游戏,具体内容包括网络建立,数据传输,玩家管理,服务器/客户端逻辑操作等。