跳至主要内容

博文

[外文翻译] 在unity3d上建立运行重新着色和衰退的粒子系统

粒子系统是极好的系统,适应于各种各样的特效在游戏中,包括火焰,爆炸,烟雾,水,灯光,行星模拟,还有很多, unity 伴随着一个建立在粒子系统上的 library 可以用来实施这些特效在你的 或者 3d 游戏上,而且在 unity 上实施这个粒子系统有着额外的灵活性和允许你创造更神奇的特效,有时候你有些情况需要要求一些专用化,这些是不可以被建立的。 此外,最近我尝试实现实现一个粒子效果让粒子分散开来像爆炸一样,然后停留在一个地方,最后缓慢的淡出不断循环。当粒子不断发散随着它们的生命周期可以熟练的用过 build-in editor ,等待它们的是终止。 这里可以看到一个粒子系统是我创建的,它使用 build-in particle editor 在 unity 中:     暂停粒子系统 根据你们所看到的,它开始于一个随机放射方向的粒子系统,然后停止,,这个暂停特效比直着向前扩展要好,而且可以实现通过贴上一个代码在粒子系统中让它暂停然后继续   public class ParticleScript : MonoBehaviour {     public float timeToPause = 2.0f;         private ParticleSystem system;     private float time;         void Awake() {         system = GetComponent ();     }         void Update() {         time += Time.deltaTime;             ...

Unity进阶技巧 - XML存档与加密

不管开发什么游戏,游戏存档是个必不可少的功能,你可能需要保存玩家的一些信息,比如身上穿戴的装备,玩家角色所处的场景等各种信息,对于存档功能 (数据持久化),Unity提供了原生技术Playerprefs,它的优点是理解和使用起来十分简单,缺点是对于大型数据存储时会力不从心,所以本文会 介绍如何使用XML来实现游戏存档和存档加密的功能。 编程环境 Unity 5.2.2 OS X EI Capitan 10.11.6 你将学到什么? 如何使用XML对数据进行序列化和反序列化操作。 如何对数据进行加密和解密操作。 不同平台下文件存放的具体路径和规则。 整体思路解析 数据存储和加密的主要逻辑思路: 使用 XmlSerializer 类对需要保存的数据类进行序列化操作,得到一串字符串。 将得到的字符串使用 RijndaeManaged 类和 ICrytoTransform 类进行加密操作,获得加密之后的字符串。 根据平台类型,确定文件保存的路径。 使用StreamWriter类将字符串保存到文件中。 数据加载和解密的主要逻辑思路: 根据存档文件的路径,使用StreamReader类读取文件中的内容(一串加密过的字符串)。 使用 RijndaeManaged 类和 ICrytoTransform 类对读取的文件内容进行解密操作,获得一串解密后的字符串。 使用 XmlSerializer 类对解密后的字符串进行反序列化操作,获得具体的游戏数据,并使用数据对游戏中的数据进行转换操作。 一、准备工作 在实现具体保存操作前,我们需要先实现我们要保存的游戏数据,本文使用一个简化的数据,假设我们保存的数据是MyPlayer类,里面记录着以下信息: 玩家的名字 玩家的等级 玩家的武器(包括物品ID,物品名字信息) 玩家的衣服(包括物品ID,物品名字信息) 下面我们就来具体实现这些数据,首先我们新建一个Unity工程,工程名字大家可以自定义,然后我们新建一个C#文件,命名为 Item ,打开item文件,并进行如下编辑: Item代码 在Item类中,我们定义了两个公共成员,_itemID和_name,分别代表物品的ID和名字。 然后我们在构造函数里面初始化了物品ID和名称。 最后我们又创建了一个构...

Unity3D研究院之提取游戏资源的三个工具支持Unity5(八十四)

这两天无意间又发现了两个提取Unity游戏资源的工具,这会儿刚好有时间我就码点字总结一下。 一、disunity 因为之前写过了所以这里就不介绍了 。Unity3D研究院之mac上从.ipa中提取unity3D游戏资源(六十六)  http://www.xuanyusong.com/archives/2584 二、UnityAssetsExplorer 下载地址: http://www.nexusmods.com/pillarsofeternity/mods/27/?tab=2&navtag=http%3A%2F%2Fwww.nexusmods.com%2Fpillarsofeternity%2Fajax%2Fmodfiles%2F%3Fid%3D27&pUp=1 百度云下载地址: http://pan.baidu.com/s/1AwTrg 如果你想解Unity5的游戏包,请使用 UnityAssetsExplorer 1.5 以上版本。 百度云下载地址: http://pan.baidu.com/s/1sjkjSJz 如下图所示,OpenAssets-File 选一个 .asset 或者一个.assetbundle 然后Extract All即可导出,感觉只是在disunity上增加了一个可视化的功能。 三、UnityStudio 其实我觉得这个工具非常牛逼、前面两个都只能把资源解开,预览图片资源得用别的工具才能打开。然而UnityStudio可以直接在自己的软件上查 看图片、shader、文本、还能直接播放音频、甚至还能看场景Hierarchy视图的树状结构。强烈推荐用UnityStudio啊。 下载地址: http://forum.xentax.com/viewtopic.php?f=10&t=11807 百度云下载地址: http://pan.baidu.com/s/1hqjMnOg UnityStudio最新版本下载 支持unity5.x   https://github.com/Perfare/UnityStudio/releases 直接预览图片 直接播放音频 查看场景树状结构 查看Shader代码。 ...

jnyy

Dream Fall

【厚积薄发】扒一扒Profiler中这几个“占坑鬼”

WaitForTargetFPS、Gfx.WaitForPresent 和 Graphics.PresentAndSync是我们经常会被问到的参数。想必正在读此文的你也经常在Profiler中遇到过这几项CPU开销过大的情况。对此,我们今天就来好好地聊一聊这几个参数的具体含义和触发规则。

Assetbundle打包(一)

一、简介 Unity的Assetbundle是Unity Pro提供的功能。 理解:Asset 资源,资产;Bundle :包,一批,捆;字面上的意思,就是把资源打包。 在项目中怎么使用Assetbunlde呢? 答:我们的项目分为两个工程:Art和Client。其中Art工程,把Prefab打包成AssetBundle及拼接美术资源,Client工程读取AssetBundle及游戏逻辑; 二、Art 下面这张是Art工程下的自定义编辑器功能,菜单栏 Game/资源打包/打包 XXX 下是是Project截图,可以看到在Product目录下,有按规则命名的文件夹。菜单栏的功能就是打包这些目录下的Prefab,例如: 执行 Game/资源打包/打包Actors ,就是把 项目工程路径/Assets/Product/Actor/* 打包成Assetbundle 当打包完之后,所有的AssetBundle都存放在Product\AssetBundles\[Android][IOS[Win32] ( 注:在打包时需注意Assetbundle有运行平台之分 ) 三、Client Client工程主要的是Code,负责游戏的逻辑。 下面是Client的Project截图( 注:StreamingAssets下的是当前运行平台AssetBundle快捷方式 ) 四、资源更新       由于移动平台上不能更新脚本,也就Prefab上绑定的脚本是不会被执行的。但是如果本地工程有同样的脚本,那么Unity会自动将这个脚本绑定在下载的Prefab上,并且他们执行的非常好。 如果本地工程中没有Prefab上的脚本,那么这个脚本是永远不会执行的。       比如:Box1.Prefab和Coin1.Prefab同样引用CBonesObject.cs,但是某些Public的变量值不一样,打包Assetbundle也是没有问题的,一样可以识别的很好。 Art工程里Prefab上绑定了脚本CBonesObject.cs   在Client工程同样有CBonesObject.cs,CBonesManager....

ScriptableObject 序列化

  ScriptableObject是一个类,它允许你存储大量用于共享的数据独立脚本实例,不要迷惑这个类同样可以叫做 SerializableObject,可以理解成是一个Unity串行化工具。这是一个编辑器类并且你可以在Inspector面板中编辑数据。例如: 如果你有一个存储了一百万数据的 int[],这个数组占用4MB内存,放在Prefab上,那么当你每次实例化Prefab,你都会得到这个数组的一个副本。如果你实例化10个这个 Prefab,那就会占用40MB内存。 可序列化的类型 Unity的serializes(序列化)支持所有原生的类型,也支持strings,arrays,lists还有Unity的Vector3等都支持,而且还支持自定义的类,但需要有一个串行的属性。 使用情景 预期使用情况,使用ScriptableObject是减少内存使用量,避免Values的副本。但是你也可以用它来定义可插拨的数据集。这方面的 一个例子是:想像RPG游戏中的NPC商店,你可以创建自定义ShopContens ScriptableObject,每个资产定义了一组可用于购买物品。在这样一个场景,游戏中有三个区域,每个区域都可以提供不同层级的项目。你的店铺 脚本将引用ShopContents对象,定义哪些项目可供选择。 Tips 当在检查ScriptableObject引用时,你可以在Inspector双击这个参考字段。 你可以创建一个自定义的Editor来查看不同的类似在Inspector,以帮助你管理它所表示的数据。 游戏关卡数据序列化 策划需求 一个游戏中的配置表数据,这些数据一般都是由策划在Excel等工具上配置,要运用到游戏中时,一般需要做一个转换,比如类似转换。这时可以使用 ScriptableObject,将数据预先处理成程序需要访问的数据结构,存储在ScriptableObject中,然后打包成一个外部文件,这样 在游戏运行的时候就不用做解析和组装了,这个功能对大批量的公用数据尤其有用!! 思路分析 策划在Art工程拼接好关卡信息之后,客户端根据关卡的中元素的位置,大小等信息生成出关卡,这中间有一个存储关卡信息的过程。我们的做法是把关卡 的信息存储在ScriptableObject上,然后在E...

Unity 协程与线程

协程是不同步的 协程 不是 线程, 协同程序是 不同步 的       一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因为 可能在相同的时间里一个线程在改变它而另一个线程正在读取它,这意味着另一个线程实际上可以改变的东西在游戏中处理的中间似乎是你的源代码一行。这是因为 你写的代码是由机器变成汇编语言,更是更复杂。正因为如此,你必须通过锁,以确保这种情况不会由任何确保没有共享内存发生。或者通过锁定其他线程使用同一 块内存,当他们在读取或更改时。 什么是协程?       协同程序绝对不是一个线程。这意味着在同一时间只有一个协同程序在执行,它会被执行在游戏的主线程上,所以实际上在同一时间游戏的核心只有一个协同程序在运行[这段翻译的不太准确]      你永远不需要担心同步或锁定一个值当你正在编写一个协同程序。你有完全的控制权,直到你的代码执行到 yiedld   因此总结一下协程的定义     协程只是部分执行,并假定在适当的条件得到满足,在未来的某一时刻将被恢复,直到它的工作完成 Unity函数执行图 Unity processes coroutines every frame of the game for every object that has one or more running.  The processing occurs after Update and before LateUpdate for most yield statements, but there are special cases: Unity的流程协同程序在游戏的每一帧每个对象为具有一个或多个正在运行的。Update() 之后,LateUpdate()之前 ,发生的 yield 语句的处理,但也有特殊情况 When the coroutine is activated it will execute right up to the next y...

[3D跑酷] DataManager

DataManager管理游戏中数据,当然这个类中大部分的属性和方法都是Public 函数列表

[3D跑酷] GameManager

GameManager在游戏中很重要,处理整个游戏的流程,但是在这个类中尽量也只是写一些重要的方法,调用其它类中的方法。 枚举项 函数列表 方法解释 // 当玩家碰到障碍(障碍Type,碰撞Position) public void obstacleCollision(ObstacleObject obstacle, Vector3 position) // 当玩家收集到金币 public void coinCollected() // 道具激活(道具Type,activate bool) public void activatePowerUp(PowerUpTypes powerUpType, bool activate) // 游戏结束(导致结束Type,waitForFram bool) public void gameOver(GameOverType gameOverType, bool waitForFrame) // 重新开始游戏(bool start) public void restartGame( bool start) // 返回主菜单(和GUIManager相关) public void backToMainMenu( bool restart) // 游戏暂停事件 public void pauseGame( bool pause) // 道具升级 public void upgradePowerUp(PowerUpTypes powerUpType) // 游戏暂停事件 public delegate void PauseHandler( bool paused); public event PauseHandler onPauseGame;

[3D跑酷] MissionManager

之前写了GUIManager,GUIClickEventReceiver还有AudioManager,这次写MissionManager 引用关系 首先看下MissionManager在项目中的引用关系 解释一下引用关系: MissionManager是一个单例类,类中定义了和任务相关的属性的方法,其它类中通过单例引用MissionManager中的方法 GameManager public void gameOver (GameOverType gameOverType, bool waitForFrame) { missionManager.gameOver (); } 再来查看MissionManager中的GameOver() public void gameOver() { checkForCompletedMissions(); } 这里的逻辑是,在GameOver的时候检查MissionManager中的任务是否完成 DataManager public int getScore () { return Mathf.RoundToInt (score * missionManager.getScoreMultiplier ()); } DataManager中 获取玩家得分  MissionManager中的倍率*Score=玩家最后的得分 GUIManager public void showGUI (GUIState state) { // activate the new gui state, deactivate the old. changeGUIState ( true , state); changeGUIState ( false , guiState); switch (state) { case GUIState.EndGame: endGameScore.text = dataManage...

3D跑酷遇到的问题

项目名称:3D跑酷项目 写作目地:使用Asset Server进行多人协作开发过程中,记录遇到的问题 问题1:UIAtlas无法自动更新 描述:NGUI的Atlas图集(图片)无法自动更新 后果:sprite丢失,切图不对应,到另一个同事那儿UI变乱了 解决办法 方法一:把NGUI的Atlas用SVN的lock功能 方法二:容易出问题的部分由一个人管理 问题2:模型的贴图无法同步 描述:模型的贴图无法同步 后果:模型贴图丢失 解决办法 排除法:使用 ResourceCheck,小工具,检查当前场景中的资源使用情况 问题3:场景中UI prefab丢失 描述:不同场景的NGUI的prefab丢失 后果:每个场景的UI都需要重新更换一遍 解决办法 方法一:多个场景共用一套UI,当切换场景时不销毁UI DontDestroyOnLoad(Object target); 方法二:把UI放在一个单独的场景 问题4:场景信息丢失 描述:场景信息丢失 后果:不能同时存在自己和他人修改的数据 解决办法 尽量不要同时多人修改同一场景中的同一GameObject,当更新时查看更新日志及检查自己的提交信息 问题5:项目目录乱 描述:项目目录乱 后果:提交或更新项目时,Unity容易Down机 解决办法 定期整理项目目录,删除/标识 无用资源,写好日志记录