mcwind's blog

游戏开发 Unity3d catia二次开发,协同设计流程,多学科设计仿真
posts - 37, comments - 5, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2011年6月8日

    最近社团筹划开发IOS平台上的游戏。考虑到设备性能的局限性,为此专门做了些研究。本文主要讲图形美术方面的注意事项,对编程等方面的建议我会陆续出文。

    Unity官网针对IOS开发有比较好的建议,我总结了翻译如下,后面附上原文。

  • 尽量控制定点数量(注意所谓顶点不是建模时的顶点,而是引擎渲染时的顶点。例如,模型一个顶点如果设置了2个法向,那么对引擎来说就是2个顶点) :
    • 对Iphone3或更高设备,每帧渲染的顶点不超过4万个
    • 对更早的设备,每帧渲染的顶点不超过1万个
  • 场景所用的材质尽量减少。即使是不同的物件,也尽量采用同一个材质。
  • 将固定的场景物件设置为静态(static)。
  • 尽量使用PVRTC(这是Apple推荐的一种格式)纹理,不行的话,也尽量用16位纹理取代32位的。
  • 不要在shader中使用multi-pass,通过用混合或者像素shader来合并不同的纹理以达到相同效果。
  • 如果自行编写shader,尽量避免使用浮点数。下面是建议的类型:
    • fixed/lowp——适用于颜色,光照等
    • half/mediump——适用于纹理UV
    • float/highp——避免在像素shader里使用,可以在顶点shader里面用于计算顶点位置
  • 在像素shader中尽量少用复杂的数学计算,例如幂函数、三角函数等。
  • 没必要的话不要使用像素光照(Pixel Lights)
  • 不要使用动态光照,用烘焙的lightmap
  • 不要使用alpha测试,用alpha混合来代替
  • 不要使用雾
  • 大场景中使用Occlusion culling来削减不可见区域。关卡设计时考虑到实施 Occlusion culling 的便利性
  • 使用sky box 来实现远景

 原文如下:

  • Keep vertex count below:
    • 40K per frame when targeting iPhone 3GS and newer devices (with SGX GPU)
    • 10K per frame when targeting older devices (with MBX GPU)
  • Keep the number of different materials per scene low - share as many materials between different objects as possible.
  • Set Static property on a non-moving objects to allow internal optimizations.
  • Use PVRTC formats for textures when possible, otherwise choose 16bit textures over 32bit.
  • Use combiners or pixel shaders to mix several textures per fragment instead of multi-pass approach.
  • If writing custom shaders, always use smallest possible floating-point types:
    • fixed / lowp -- perfect for color, lighting information and normals,
    • half / mediump -- for texture UV coordinates,
    • float / highp -- avoid in pixel shaders, fine to use in vertex shader for vertex position calculations.
  • Minimize use of complex mathematical operations such as pow, sin, cos etc in pixel shaders.
  • Do not use Pixel Lights when it is not necessary -- choose to have only a single (preferably directional) pixel light affecting your geometry.
  • Do not use dynamic lights when it is not necessary -- choose baking lighting instead.
  • Choose to use less textures per fragment.
  • Avoid alpha-testing, choose alpha-blending instead.
  • Do not use fog when it is not necessary.
  • Learn benefits of Occlusion culling and use it to reduce amount of visible geometry and draw-calls in case of complex static scenes with lots of occlusion. Plan your levels to benefit from Occlusion culling.
  • Use skyboxes to "fake" distant geometry.

 

posted @ 2011-06-08 15:43 mcwind 阅读(757) 评论(0) 编辑

2011年4月29日

在我早先的一篇文章《 Unity动态载入可执行代码的方法》中,介绍了采用反射技术动态载入并使用C#程序集的方法。不过这种方法感觉用起来很麻烦。有的时候我们或许并不需要动态载入程序集,而只想静态地使用它,就像使用.net自带的那些程序集一样,添加Reference,然后使用即可。

由于windows环境下的Unity编译脚本时,本质上还是生成.net程序集,而且其C#脚本编程其实就是.net C#语言编程。用Visual Studio 编写脚本工程是,我们可以直观地看到Unity工程所引用的程序集。

image

既然能引用.net框架的程序集,自然也能引用我们自己编写的程序集吧。经过几次试验,终于获得成功,步骤如下:

1、编写要引用的程序集

我们几乎可以编写任何用途的程序集,就像用C#开发.net类库一样。不过需要注意的是,如果要编写从Unity继承的类(比如从MonoBehaviour派生的组件等等),则不能使用namespace,目前的Unity不支持,用了编译报错。

虽然不能使用namespace,但我实际测试后发现若新项目中创建了与引用的程序集同名的类,Unity编译并不会报错,而且实际执行也很正常。由于没有介绍Unity内部如何编译的资料,我们还是尽量不要重名吧。

2、将程序集DLL放置到目标Unity工程的Asset目录下(这点很重要)

虽然可以用VisualStudio编写Unity代码,但实际上Unity生成游戏时还要自己再编译一遍。因此,在VS中的引用设置不能被Unity所使用。我曾经尝试过把要引用的程序集放在GAC中也不行。正确的做法是把dll放在Asset下,Unity能很好地识别它。

image

如果我们把组件编写在程序集中的话,展开程序集就能看到这些组件,甚至可以直接把它们拖动到GameObject中,很强大吧!

3、在目标工程中添加引用,编写代码

这个没什么好说的。

4、测试通过,成功!

由于可以方便地使用程序集,Unity给我们的项目开发提供了更大的灵活性,也更便于组织实施软件工程了。我现在正在做的一个独立游戏项目就采用了这种技术。做这个项目的过程中也不断学习了解了Unity的一些东西,大家可以在我的博客里找到更多内容。

posted @ 2011-04-29 15:16 mcwind 阅读(680) 评论(0) 编辑

2011年4月4日

今天查到几个用脚本动态生成Mesh的例子,可以模拟波纹、轨迹等,挺有意思。

原文地址:http://unity3d.com/support/resources/example-projects/procedural-examples

posted @ 2011-04-04 23:02 mcwind 阅读(668) 评论(0) 编辑

2011年3月25日

概述

在游戏中经常需要动态地载入一些数据。例如让玩家定制角色外貌时,需要从数据文件读取各种身体部位的信息;或者玩家访问NPC购买装备时,需要从数据文件读取装备信息等等。为了减少游戏程序的大小,我们往往采用最简单的文本文件来保存这些信息。所以本文总结一下Unity常用的读取文本数据的方法。

因为我是边开发项目便记录心得,时间很仓促,只能先把关键点记录下来,留待以后有时间再补全吧。对于没有详细说的内容,一般google一下都能查到更详细的说明。

让Text支持中文

读取TextAsset数据

在开发阶段,将Txt文件放置到Unity项目Asset文件目录下,Unity就会识别该文件成为TextAsset。Unity脚本中专门有TextAsset类来操作文本中的数据。

有时候你可能会发现文本中的中文汉字无法显示,这是因为TextAsset只支持UTF-8的缘故。可以用写字板将该txt文件重新存为UTF-8格式即可解决。

TextAsset和其他类型Asset一样,可以拖动到组件面板中用于赋值,我称之为静态载入。如果要在游戏运行中实现动态载入TextAsset,就必须采用Resource.Load()方法,或者用AssetBundle来实现。

需要理解的是,TextAsset是随游戏项目一起编译的。在最终的游戏程序中,是看不到原先的txt文件的。如果想在游戏运行时动态读取一个独立的txt文件数据,就要用下面的“读取外部文本数据”方法。

读取外部文本数据

对于windows平台上的游戏而言,运行中读取外部文本文件的方法非常简单,就是传统的文件读写操作。例如可以用.net的StreamReader类来实现。

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        try 
        {
            // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (StreamReader sr = new StreamReader("TestFile.txt")) 
            {
                String line;
                // Read and display lines from the file until the end of 
                // the file is reached.
                while ((line = sr.ReadLine()) != null) 
                {
                    Console.WriteLine(line);
                }
            }
        }
        catch (Exception e) 
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}

posted @ 2011-03-25 13:55 mcwind 阅读(1047) 评论(0) 编辑

2011年3月19日

先把原贴纪录以下,有空了再来翻译。基本步骤很简单,就是三步:

1、把要载入的代码编译成assembly(dll)

2、用WWW类下载目标assembly

3、用.Net反射技术载入assembly

以前也有这个思路,不过一直没时间测试。回头自己测试确认了再来补充。

英文原贴:http://angryant.com/general/tipsandtricks/downloading-the-hydra/

posted @ 2011-03-19 11:38 mcwind 阅读(657) 评论(0) 编辑

2011年3月3日

摘要: 本文摘要本文主要记录了我在开发格斗游戏时用到的几个运动特效,可以方便地表现武器挥动、运动模糊和其他一些特效。灵活使用可以大幅提升格斗游戏的视觉效果和感染力。有关Unity的其他话题也可以查阅我的其他文章。 一、运动轨迹运动轨迹常常用于表现武器的挥舞效果,在提高速度感的同时又能让玩家看清楚招式动作,所以是常见的一种格斗特效。Unity中可以直接使用TrailRender来实现该效果。 二、运动模糊运动模糊就是保留前几帧影像,形成一定的重影模糊效果,从而突出速度感。配合慢镜头使用往往能很好地表现运动高潮效果。运动模糊在Unity中是通过Motion Blur image effect脚本实现的。 阅读全文

posted @ 2011-03-03 23:54 mcwind 阅读(2101) 评论(0) 编辑

2011年2月27日

摘要: 本文摘要 本文首先描述了Unity3.0在支持大型游戏项目开发时的两个不足:即对模块化和svn协同缺乏支持。随后,分析了Unity自带的Export/Import Package 功能,并提出了使用此功能与svn配合实现多人项目协同的方法。有关Unity的其他话题也可以查阅我的其他文章。 Unity项目协同的挑战 在使用Unity开发游戏项目时,一般都需要多人同时工作。例如每人负责不同的场景,或者一些人负责调试光照和渲染,另一些负责编写程序逻辑。总之一个人全包的情况对于稍大一点的项目而言少之又少。但遗憾的是Unity对协同项目工作和大型项目的支持可以用糟糕来形容。 首先,Unity没有模块化开阅读全文

posted @ 2011-02-27 02:11 mcwind 阅读(1137) 评论(0) 编辑

2011年2月21日

摘要: 在上一篇Unity角色模型优化要点中,我主要是翻译了官方的原文,并加了少量自己的注释。随后,经过这几天对角色换肤的测试,总结出一些建模和导入的要点,供大家参考。 所谓角色换肤也就是游戏中常见的角色自定制功能:玩家开始游戏前,一般需要创建一个游戏角色,选择性别、容貌、发型等等。进入游戏后,就可以操作自己创建的角色做出行走、跳跃、攻击等动作。很多游戏还允许玩家在中途变换发型甚至改变体态(例如升级后肌肉变得发达)等等。下图就是WOW中角色选择的画面示例。 从游戏开发者的角度来看,由于可定制元素排列组合的结果非常多,不可能事先将所有结果都一个一个建出来并施加动作。所以必须采取分部位建模,然后通过编程控阅读全文

posted @ 2011-02-21 01:44 mcwind 阅读(1609) 评论(3) 编辑

2011年2月18日

摘要: 在和朋友制作游戏的过程中,经常有人问到角色模型应该怎么建才更符合Unity的需要。在此,我将Unity官方网站中关于建模要求的部分翻译如下,供参考。限于本人英文水平有限,而且并没有一字一句地翻译,而是基于自己对引擎的理解,采用更符合中文的语序来翻译。故采取在原文段落下方附加中文翻译的做法,以便大家对照。有些内容若朋友们觉得翻译得不妥,欢迎给我留言。Modeling Optimized Characters角色优化建模Use one Skinned Mesh Renderer一个角色仅使用一个SkinedMeshRenderer(后简称 SMR)Your character should use阅读全文

posted @ 2011-02-18 22:06 mcwind 阅读(1096) 评论(0) 编辑

摘要: 游戏世界中物体是由网格面构成的,而每个网格面都有正反两个面。默认Unity是不绘制网格反面(也叫背面 BackFace)的,这样是为了提高速度。因为Unity假设绝大多数情况下被物体都是有体积的,所以每个反面都会被正面遮挡,也就无需绘制。 不过有些物体我们建模时并没有体积,例如披风、伞布等等。此时,就需要告诉Unity对这个物品正反面都要绘制。 Unity中可以使用Shader来实现此功能。首先,在项目视图中右键新建一个shader文件(如果该物品已经使用了一个shader,则可直接打开该文件),然后在sub shader中加入 Cull Off语句即可。 关于Cull 的其他信息,可以参考.阅读全文

posted @ 2011-02-18 17:44 mcwind 阅读(414) 评论(0) 编辑