如何使用Unity3d粒子实现拖尾效果
![[��ǩ:����] [��ǩ:����]](https://www.xuefen.net//file/upload/img/7/47.jpg)
这个跟我之前参与的游戏很相似,我们山寨过一款植物大战僵尸的游戏,之前我们是采用sm2的插件将动画序列帧坐在一张贴图上然后通过脚本控制播放角色的动画,当然肯定得把这个贴图做成一个材质了,材质就得付给一个cube了,有了cube你不就实现碰撞了啊!
2020-01-14【unity partical trail 拖尾效果】
【作此文 以备使用】
【前言废话】
某位 特效 大佬教我的简单方法。
效果如下:
【步骤1】创建particalEffect
【步骤2】上粒子材质
【步骤3】拖尾添加
1. 点开particalSystem中的Trail
2.变成这个样子(不要慌)
3.拖一个拖尾材质到 particalSystem-->Renderer--->Trail Material中
4.然后变成这个样子
【步骤4】调整拖尾效果
1. 找到particalSystem-->Trail-->Width over Trail
选择 Random Between Two Curves
2.根据具体要求调整宽度
3.完成
unity拖尾颜色发灰
你问的是unity拖尾颜色发灰怎么办吧。重新设置。
unity拖尾颜色发灰需要在fbx的导入设置中,重新设置拖尾法线的计算方式。
Unity是开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具。
unity 2d物体怎么做拖尾效果
在本篇教程中,我们将使用简单的物理机制模拟一个动态的2D水体。我们将使用一个线性渲染器、网格渲染器,触发器以及粒子的混合体来创造这一水体效果,最终得到可运用于你下款游戏的水纹和水花。这里包含了Unity样本源,但你应该能够使用任何游戏引擎以相同的原理执行类似的操作。
设置水体管理器
我们将使用Unity的一个线性渲染器来渲染我们的水体表面,并使用这些节点来展现持续的波纹。
unity-water-linerenderer(from gamedevelopment)
我们将追踪每个节点的位置、速度和加速情况。为此,我们将会使用到阵列。所以在我们的类顶端将添加如下变量:
float[] xpositions;
float[] ypositions;
float[] velocities;
float[] accelerations;
LineRenderer Body;
LineRenderer将存储我们所有的节点,并概述我们的水体。我们仍需要水体本身,将使用Meshes来创造。我们将需要对象来托管这些网格。
GameObject[] meshobjects;
Mesh[] meshes;
我们还需要碰撞器以便事物可同水体互动:
GameObject[] colliders;
我们也存储了所有的常量:
co
nst float springco
nstant = 0.02f;
co
nst float damping = 0.04f;
co
nst float spread = 0.05f;
co
nst float z = -1f;
这些常量中的z是我们为水体设置的Z位移。我们将使用-1标注它,这样它就会呈现于我们的对象之前(游戏邦注:你可能想根据自己的需求将其调整为在对象之前或之后,那你就必须使用Z坐标来确定与之相关的精灵所在的位置)。
下一步,我们将保持一些值:
float ba
seheight;
float left;
float bottom;
这些就是水的维度。
我们将需要一些可以在编辑器中设置的公开变量。首先,我们将为水花使用粒子系统:
public GameObject splash:
接下来就是我们将用于线性渲染器的材料:
public Material mat:
此外,我们将为主要水体使用的网格类型如下:
public GameObject watermesh:
我们想要能够托管所有这些数据的游戏对象,令其作为管理器,产出我们游戏中的水体。为此,我们将编写SpawnWater()函数。
这个函数将采用水体左边、跑马度、顶点以及底部的输入:
public void SpawnWater(float Left,float Width,float Top,float Bottom)
{
(虽然这看似有所矛盾,但却有利于从左往右快速进行关卡设计)
创造节点
现在我们将找出自己需要多少节点:
int edgecount = Mathf.RoundToInt(Width) * 5;
int nodecount = edgecount + 1;
我们将针对每个单位宽度使用5个节点,以便呈现流畅的移动(你可以改变这一点以便平衡效率与流畅性)。我们由此可得到所有线段,然后需要在末端的节点 + 1。
我们要做的首件事就是以LineRenderer组件渲染水体:
Body = gameObject.AddComponentlt;LineRenderer;();
Body.material = mat;
Body.material.renderQueue = 1000;
Body.SetVertexCount(nodecount);
Body.SetWidth(0.1f,0.1f);
我们在此还要做的是选择材料,并通过选择渲染队列中的位置而令其在水面之上渲染。我们设置正确的节点数据,将线段宽度设为0.1。
你可以根据自己所需的线段粗细来改变这一宽度。你可能注意到了SetWidth()需要两个参数,这是线段开始及末尾的宽度。我们希望该宽度恒定不变。
现在我们制作了节点,将初始化我们所有的顶级变量:
xpositions = new float[nodecount];
ypositions = new float[nodecount];
velocities = new float[nodecount];
accelerations = new float[nodecount];
meshobjects = new GameObject[edgecount];
meshes = new Mesh[edgecount];
colliders = new GameObject[edgecount];
ba
seheight = Top;
bottom = Bottom;
left = Left;
我们已经有了所有阵列,将控制我们的数据。
现在要设置我们阵列的值。我们将从节点开始:
for (int i = 0; i lt; nodecount; i++)
{
ypositions[i] = Top;
xpositions[i] = Left + Width * i / edgecount;
accelerations[i] = 0;
velocities[i] = 0;
Body.SetPosition(i,new Vector3(xpositions[i],ypositions[i],z));
}
在此,我们将所有Y位置设于水体之上,之后一起渐进增加所有节点。因为水面平静,我们的速度和加速值最初为0。
我们将把LineRenderer (Body)中的每个节点设为其正确的位置,以此完成这个循环。
创造网格
这正是它棘手的地方。
我们有自己的线段,但我们并没有水体本身。我们要使用网格来制作,如下所示:
for (int i = 0; i lt; edgecount; i++)
{
meshes[i] = new Mesh();
现在,网格存储了一系列变量。首个变量相当简单:它包含了所有顶点(或转角)。
unity-water-Firstmesh(from gamedevelopment)
该图表显示了我们所需的网格片段的样子。第一个片段中的顶点被标注出来了。我们总共需要4个顶点。
Vector3[] Vertices = new Vector3[4];
Vertices[0] = new Vector3(xpositions[i],ypositions[i],z);
Vertices[1] = new Vector3(xpositions[i + 1],ypositions[i + 1],z);
Vertices[2] = new Vector3(xpositions[i],bottom,z);
Vertices[3] = new Vector3(xpositions[i+1],bottom,z);
现在如你所见,顶点0处于左上角,1处于右上角,2是左下角,3是右下角。我们之后要记住。
网格所需的第二个性能就是UV。网格拥有纹理,UV会选择我们想撷取的那部分纹理。在这种情况下,我们只想要左上角,右上角,右下角和右下角的纹理。
Vector2[] UVs = new Vector2[4];
UVs[0] = new Vector2(0,1);
UVs[1] = new Vector2(1,1);
UVs[2] = new Vector2(0,0);
UVs[3] = new Vector2(1,0);
现在我们又需要这些数据了。网格是由三角形组成的,我们知道任何四边形都是由两个三角形组成的,所以现在我们需要告诉网格它如何绘制这些三角形。
unity-water-Tris(from gamedevelopment)
看看含有节点顺序标注的转角。三角形A连接节点0,1,以及3,三角形B连接节点3,2,1。因此我们想制作一个包含6个整数的阵列:
int[] tris = new int[6] { 0,1,3,3,2,0 };
这就创造了我们的四边形。现在我们要设置网格的值。
meshes[i].vertices = Vertices;
meshes[i].uv = UVs;
meshes[i].triangles = tris;
现在我们已经有了自己的网格,但我们没有在场景是渲染它们的游戏对象。所以我们将从包括一个网格渲染器和筛网过滤器的watermesh预制件来创造它们。
meshobjects[i] = Instantiate(watermesh,Vector3.zero,Quaternion.identity) as GameObject;
meshobjects[i].GetComponentlt;MeshFilter;().mesh = meshes[i];
meshobjects[i].transform.parent = transform;
我们设置了网格,令其成为水体管理器的子项。
创造碰撞效果
现在我们还需要自己的碰撞器:
colliders[i] = new GameObject();
colliders[i].name = “Trigger”;
colliders[i].AddComponentlt;BoxCollider2D;();
colliders[i].transform.parent = transform;
colliders[i].transform.position = new Vector3(Left + Width * (i + 0.5f) / edgecount,Top – 0.5f,0);
colliders[i].transform.localScale = new Vector3(Width / edgecount,1,1);
colliders[i].GetComponentlt;BoxCollider2D;().isTrigger = true;
colliders[i].AddComponentlt;WaterDetector;();
至此,我们制作了方形碰撞器,给它们一个名称,以便它们会在场景中显得更整洁一点,并且再次制作水体管理器的每个子项。我们将它们的位置设置于两个节点之点,设置好大小,并为其添加了WaterDetector类。
现在我们拥有自己的网格,我们需要一个函数随着水体移动进行更新:
void Updat
eMeshes()
{
for (int i = 0; i lt; meshes.Lenh; i++)
{
Vector3[] Vertices = new Vector3[4];
Vertices[0] = new Vector3(xpositions[i],ypositions[i],z);
Vertices[1] = new Vector3(xpositions[i+1],ypositions[i+1],z);
Vertices[2] = new Vector3(xpositions[i],bottom,z);
Vertices[3] = new Vector3(xpositions[i+1],bottom,z);
meshes[i].vertices = Vertices;
}
}
你可能注意到了这个函数只使用了我们之前编写的代码。唯一的区别在于这次我们并不需要设置三角形的UV,因为这些仍然保持不变。
我们的下一步任务是让水体本身运行。我们将使用FixedUpdate()递增地来调整它们。
void FixedUpdate()
{
执行物理机制
首先,我们将把Hooke定律写Euler方法结合在一起找到新坐标、加速和速度。
Hooke定律是F=kx,这里的F是指由水流产生的力(记住,我们将把水体表面模拟为水流),k是指水流的常量,x则是位移。我们的位移将成为每个节点的y坐标减去节点的基本高度。
下一步,我们将添加一个与力的速度成比例的阻尼因素来削弱力。
for (int i = 0; i lt; xpositions.Lenh ; i++)
{
float force = springco
nstant * (ypositions[i] – ba
seheight) + velocities[i]*damping ;
accelerations[i] = -force;
ypositions[i] += velocities[i];
velocities[i] += accelerations[i];
Body.SetPosition(i,new Vector3(xpositions[i],ypositions[i],z));
}
Euler方法很简单,我们只要向速度添加加速,向每帧坐标增加速度。
注:我只是假设每个节点的质量为1,但你可能会想用:
accelerations[i] = -force/mass;
现在我们将创造波传播。以下节点是根据Michael Hoffman的教程调整而来的:
float[] leftDeltas = new float[xpositions.Lenh];
float[] rightDeltas = new float[xpositions.Lenh];
在此,我们要创造两个阵列。针对每个节点,我们将检查之前节点的高度,以及当前节点的高度,并将二者差别放入leftDeltas。
之后,我们将检查后续节点的高度与当前检查节点的高度,并将二者的差别放入rightDeltas(我们将乘以一个传播常量来增加所有值)。
for (int j = 0; j lt; 8; j++)
{
for (int i = 0; i lt; xpositions.Lenh; i++)
{
if (i ; 0)
{
leftDeltas[i] = spread * (ypositions[i] – ypositions[i-1]);
velocities[i - 1] += leftDeltas[i];
}
if (i lt; xpositions.Lenh – 1)
{
rightDeltas[i] = spread * (ypositions[i] – ypositions[i + 1]);
velocities[i + 1] += rightDeltas[i];
}
}
}
当我们集齐所有的高度数据时,我们最后就可以派上用场了。我们无法查看到最右端的节点右侧,或者最大左端的节点左侧,因此基条件就是i ; 0以及i lt; xpositions.Lenh – 1。
因此,要注意我们在一个循环中包含整片代码,并运行它8次。这是因为我们想以少量而多次的时间运行这一过程,而不是进行一次大型运算,因为这会削弱流动性。
添加水花
现在我们已经有了流动的水体,下一步就需要让它溅起水花!
为此,我们要增加一个称为Splash()的函数,它会检查水花的X坐标,以及它所击中的任何物体的速度。将其设置为公开状态,这样我们可以在之后的碰撞器中调用它。
public void Splash(float xpos,float velocity)
{
首先,我们应该确保特定的坐标位于我们水体的范围之内:
if (xpos ;= xpositions[0] xpos lt;= xpositions[xpositions.Lenh-1])
{
然后我们将调整xpos,让它出现在相对于水体起点的位置上:
xpos -= xpositions[0];
下一步,我们将找到它所接触的节点。我们可以这样计算:
int index = Mathf.RoundToInt((xpositions.Lenh-1)*(xpos / (xpositions[xpositions.Lenh-1] – xpositions[0])));
这就是它的运行方式:
1.我们选取相对于水体左侧边缘位置的水花位置(xpos)。
2.我们将相对于水体左侧边缘的的右侧位置进行划分。
3.这让我们知道了水花所在的位置。例如,位于水体四分之三处的水花的值就是0.75。
4.我们将把这一数字乘以边缘的数量,这就可以得到我们水花最接近的节点。
velocities[index] = velocity;
现在我们要设置击中水面的物体的速度,令其与节点速度一致,以样节点就会被该物体拖入深处。
Particle-System(from gamedevelopment)
注:你可以根据自己的需求改变这条线段。例如,你可以将其速度添加到当前速度,或者使用动量而非速度,并除以你节点的质量。
现在,我们想制作一个将产生水花的粒子系统。我们早点定义,将其称为“splash”。要确保不要让它与Splash()相混淆。
首先,我们要设置水花的参,以便调整物体的速度:
float lifetime = 0.93f + Mathf.Abs(velocity)*0.07f;
splash.GetComponentlt;ParticleSystem;().startSpeed = 8+2*Mathf.Pow(Mathf.Abs(velocity),0.5f);
splash.GetComponentlt;ParticleSystem;().startSpeed = 9 + 2 * Mathf.Pow(Mathf.Abs(velocity),0.5f);
splash.GetComponentlt;ParticleSystem;().startLifetime = lifetime;
在此,我们要选取粒子,设置它们的生命周期,以免他们击中水面就快速消失,并且根据它们速度的直角设置速度(为小小的水花增加一个常量)。
你可能会看着代码心想,“为什么要两次设置startSpeed?”你这样想没有错,问题在于,我们使用一个起始速度设置为“两个常量间的随机数”这种粒子系统(Shuriken)。不幸的是,我们并没有太多以脚本访问Shuriken的途径 ,所以为了获得这一行为,我们必须两次设置这个值。
求助,u3d拖尾效果突然不显示了
要解决该问题必须从源头做起,必须减小重叠比。然而,由于4953天然缺陷,行电源的下降沿无论如何是无法靠4953自身来降低。一种方法就是要外加吸收电路,这种外吸收的方法其效果与所投入的成本密切相关,要想取得好的效果,就要外加比较复杂的线路,这样做不仅增加了整机成本还给系统布线带来很多不便和困扰。很显然,采用D4963 比现有的4953 下降沿减小了近千倍,应用方式与现有的4953基本一致,不许外加任何元件。这就使得扫描显示屏的设计更加灵活,在不牺牲帧频的前提下扫描级数还可以大幅增加,这将大大节省整机成本。我们以1/32扫描为例,若帧频设在250Hz时,仅重叠比Tn/Tm单项参数来看,Tn/Tm=0.0001/(1000/(32×250))=0.08%。毫无疑问,这种情形下LED扫描显示屏拖尾这个瓶颈问题将得到根本的改观。可以看出,扫描减少重叠比,外加吸收电路可以降低拖尾的现象,应用方式的合适配对,使得LED显示屏的设计灵活多变.除了操作人员的应用方式之外,而LED显示屏本身的设计也是解决拖尾的最主原因。
Unity3d粒子发射器怎样才能随着物体旋转移动,同时有拖尾
可以。有几种方法。
最简单是播放动作动画的同时,用脚本控制它的移动旋转。
也可以用动画混合,相当于同时播放两个动画,将两个动画设置为不同层,然后进行混合播放。
还可以为它增加一个父物体,物体在播放动作动画的同时,父物体做移动旋转。
unity3d 5.6.4拖尾宽度开始和结束的设置,版本变化后找不到了
这里只不过是把以前的数值表现形式改成了曲线的表现形式,
你直接设置曲线的起点和终点就等于设置了原来的start width和end width ,这里的曲线可以设置整个过程中width的变换
Unity 3D 5.3.1中scaling mode这个命令对粒子有什么作用
Scaling Mode这一栏的用处是,可以按R,或者调整Scale里面的参数来拉伸、缩小、扩大粒子本身。
Hierarchy是受自身的缩放影响,也受父级的缩放影响。
Local是只受自身的缩放影响。
Shape是不受缩放影响。
如果要做拖尾的话,就把Simulation Space改成World就可以了。
unity认证报考条件
没有什么大的限制
知道考试内容,申请即可(应该)
主题 概要 内容 了解Unity引擎的发展以及它可以发布哪些平台。
跨平台插件安装 掌握Unity引擎与跨平台插件的安装方法。
Unity的应用领域 了解Unity引擎的应用领域。
Unity工程开发框架 掌握Unity引擎工程文件结构与开发框架。
工程与应用 能够明确工程与应用的概念与区别。
场景 掌握场景的概念及其组成。
游戏对象与预置物体 理解游戏对象与预置物体的概念与区别。
组件与脚本 熟知组件和脚本的用途
Unity资源与组件 理解组件与资源的结构与关系
Unity用户界面 界面的布局 掌握自定义布局的使用方法
工具栏功能的用途 如何识别工具栏。并了解工具栏上所有控件的功能。
工程视图 掌握如何通过工程视图操作对资源进行管理。
场景视图 能够对场景视图的游戏对象进行移动、旋转和缩放的操作,并能熟练掌握对场景视图视角的导航功能。
层级视图 能够通过层级视图了解场景中游戏对象的父子关系,并能够通过在层次视图的操作来建立与打破游戏对象间的父子关系。
检查器视图 能够通过检查器视图查看游戏对象组件的信息,并能够通过检查器视图选项来设置导入资源的详细信息。
游戏视图 能够知道如何能过游戏视图控制栏上的控件对游戏进行预览。
快捷键 掌握对引擎界面操作的各类快捷键,能够通过快捷键操作提高工作效率。其中包括对场景视图的视角导航、游戏对象的操作,播放与暂停播放等快捷键的使用。
游戏多媒体基本原理 屏幕分辨率与像素 理解屏幕分辨率与像素的概念。
2D图像 能够知道常用图像保存格式以及它们间的区别,这其中包括PNG与JPG等图像格式,知道压缩图像与非压缩的区别。
3D模型 能够知道常用的3D建模格式以及它们间的区别,这其中包括FBX与OBJ等建模格式。
音频 了解常用的音频格式,这其中包括有MP3和WAV。
资源工作流程 资源的导入 能够通过检查器视图对不同的资源导入进行设置。并理解各设置参数的涵义。
打包 掌握将资源打包的方法。能够通过Packages来进行资源和预置物体的迁移。
预置物体 能够通过创建游戏对象为其添置预置物体,并为它添加所需的组件。
动画 能够对模型的动画进行设置,这其中包括对Mecanim动画系统的动画类型选择,创建Avatars、动画切割以及Animator Controller的基本使用。
场景构建 场景布置 能够通过使用预制物体在场景实例,并组织其层次结构对场景进行布置。
灯光 能够识别和理解不同类型光源的功能,并懂得如何去使用他们。
音频 掌握基本音频组件的使用方法,能够在场景的游戏对象中创建并播放它们。
Light mapping烘焙技术 理解Light mapping烘焙技术的作用,能够为场景添加基本的光照贴图。
Occlusion Culling遮挡剔除技术 了解遮挡剔除技术的作用,掌握如何为场景添加遮挡剔除的基本方法。
组件初级应用 Rendering渲染 掌握渲染相关组件的基本用法,其中包括摄像机、灯光、天空盒、GUI文字、GUI纹理等组件。
Physics物理 掌握物理相关组件的基本用法,其中包括刚体、碰撞体、铰链等组件。掌握基本的碰撞检测原理和方法。
Shuriken粒子系统 掌握Shuriken粒子组件的基本用法,能够理解检查器视图中粒子常用参数的用途并调试出相对应的效果。
Effects特效 掌握特效相关组件的基本用法,其中包括拖尾渲染器、线渲染器、光晕及投射等组件。
Audio音频 掌握音频相关音频的基本用法,其中包括音频监听器、音源等组件。
Animation动画 掌握动画相关组件的基本用法。
Mesh网格 了解网格相关组件的用途,其中包括网格适配器与网格渲染器等组件。
发布 发布可执行文件 能够掌握对PC,MAC以及网页平台可执行文件的发布方法。
以上就是unity认证考试的主要内容,希望可以帮助到你,想要了解更多的unity内容,可以到纳金论坛上去查找。
开发一款游戏需要什么软件?
游戏开发指利用计算机编程语言,如C编程语言、C++、java等,编写计算机、手机或游戏机上的游戏。目前流行的游戏开发语言为C++编程语言,目前流行的游戏开发接口为DirectX9.0,还有OpenGL、SDL(SimpleDirectMediaLayer)等。现在手机上玩的游戏分为Android与IOS两种不同平台,分别是用eclipse/MyEclipse和xcode。现在也流行一些跨平台的编程引擎,例如cocos2d-x、unity3D等。
接下来,再看看游戏开发的课程,游戏开发的课程除了理论知识还包括软件的操作。
C++程序基础:通过学习C++语言,奠定编程基础。使用VS.net2005编译工具,高效构建代码。
算法与数据结构:通过学习算法与数据结构的基本概念,了解常用的数据结构及相关的抽象数据定义,认识计算机求解的基本思路与方法。
Win32程序入门:通过API和MFC的学习,熟悉Windows环境下程序设计基本方法。通过使用DirectX绘制2D图形。
游戏数学和智能应用:游戏中的坐标系,矢量、矩阵,几何碰撞,物理模拟,人工智能与寻路算法。
2D游戏技术与应用:2D游戏技术概论,游戏地图系统,GUI系统,战斗系统设计,任务系统优秀的声音引擎BASS,Cocos2D-X引擎,Box2D物理引擎。
游戏开发的常用软件有C++、DirectX、Box2D、Cocos2d-x、Unity,不能说哪款最好用,因为这是游戏开发过程中都要用到的软件,必须都精通。
C++是在C语言的基础上开发的一种通用编程语言,应用广泛。
DirectX,(DirecteXtension,简称DX)是由微软公司创建的多媒体编程接口。
Box2D是一个用于模拟2D刚体物体的C++引擎。zlib许可是一个自由软件授权协议,但并非copyleft。
Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++Cocos2d-iPhone项目的版本。
Unity是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎
首先你有编程基础是再好不过的了。
手机游戏开发的平台是JME,一般不会用到C++。当然学过C++的更好。
你学的可能是JEE,所以你一定要把JME好好学一下,重点是MIDlet,CANVAS,RecordStore。此外MIDP1.0和2.0的特性要搞清楚,如果做和网络有关的还要学习MIDP网络编程。掌握这些就基本上门什么问题了,学的不多,对于一个会C++/JEE的人来说,应该可以在1个月左右学完。
和其他语言一样,JME关键是要多练,自己试着开发几个小游戏出来是不错的练习办法,可以找出你学习上的不足点。有条件的话,做出来的游戏应该拿到真机上运行,因为在模拟器上运行和真机有区别。
如果是独立开发手游,那么还要掌握一些基本的软件,如PhotoShop,Mappy,和简单的声效处理。
另外有需求的话可以学学JTWI,特别是Mobile3DGraphics(M3G)技术,这是以后发展的趋势(由于本人对这块很薄弱,所以不能误导你,就不多说了)。
总之,你就再需要学JME和多练习,就够了。PS.一般来说JME工程师比JSE和JEE的待遇要好一些。而且从事游戏行业的上班玩游戏不会被骂。如果哪天你闲着无聊和同事聊天聊的太嚣张被BOSS看见了,他第一句应该是说“有闲功夫多玩玩游戏,闲聊什么天!。”
手机游戏制作
全球手机顶尖游戏3dmotoracer制作全揭密
图文_吴刚北京数位红软件应用技术有限公司执行董事
林志强数位红nightmareii首席三维美术设计师
王科数位红motoracer3d首席三维美术设计师
3dmotoracer是数位红公司开发的一款针对nokias60设备及sonyericssonp800(uiq)的3d游戏,该游戏上市几个月来,已经成为全球最畅销的nokias60、p800游戏应用前三名之一。本文就是对3dmotoracer的开发过程进行大致的介绍。
i.游戏引擎的准备
在制作游戏之前,必须有一套经过长期测试并且适用的游戏引擎。
数位红用了两年的时间总结开发出一套基于移动设备的游戏引擎:dragonbonegameengineformobilephone(龙骨),他可以支持目前大部分的高端移动设备,它不仅可以使程序开发人员及游戏项目节省了大量的时间,另外还可以让美术人员最直观的看到其设计效果。它最大的价值就是可以使开发人员的一套代码在不需要改动程序的情况下编译运行在不同设备平台上(改动不超过20%)。目前数位红及其他公司已经使用它开发游戏超过了30款。
引擎提供了非常完善的9个模块与3个增强模块,可以完全满足各类游戏开发的需要。游戏引擎可以直接嵌入到开发者的程序中,不需要额外的支持程序即可使所开发的游戏独立运行。游戏引擎简单、易用,编译后体积很小,占用内存也很小,可以节省玩家的内存空间及无线下载费用。基本引擎包含9个模块,引擎函数界面提供了类似windows的使用模式:
1、文件操作模块:提供类似标准c的fopen,fclose等函数。
2、内存管理模块
3、2d图形图象模块
4、对话框模块
5、sms操作模块:可以在程序内部对sms的收发进行截获处理。
6、加密模块:提供识别使用设备的imei功能,用于软件的加密目的。
7、声音模块
8、资源打包及压缩模块:可是使最后发售的软件包体积变小,尽量少的占用用户的内存空间。
9、常用函数:如字符串操作等函数。
10、例子:提供一套完整游戏magicline的源程序。
引擎增强模块构成
其增强部分,包含三个模块:
1、实时3d增强模块
2、声音增强模块
3、图形文件增强模块
ii.正式开发的前期工作
a.开发工具的准备
在很多人看来,手机游戏还是一种很新鲜时尚的玩意儿,所以,谈起手机游戏的时候难免有种莫测高深的感觉。其实,手机游戏的整个制作过程十分简单。从某种角度而言,它是一种传统的回归,同时也是新旧技术的相互融合。最常用的开发工具有vc++,jbuilder及codewarrior,在设计工具上则更是和普通的pc游戏制作软件没有大的区别。有的设计人员更愿意使用“骨灰级”的二维设计工具dp,也有人愿意用3dmax、maya建模之后再进行二维修改,当然所有这些方法都要根据游戏的最终设定来决定。我们在做java游戏的时,一般都是采用像素级的二维绘制完成图片,即逐个像素点的完成。但在制作pda等类似设备的游戏时,就会采用3dmax或者maya建立模型,渲染后再修整。在设计过程中,我们也与大多数游戏公司一样使用了maya、3dmax、photoshop、painter等工具。
b.确定游戏的各项参数及目标设备
这要求程序人员能给出准确的图片限制大小,即所有图片允许美工占用多少空间。由于手机游戏的制作受数据量的限制很大,所以我们在设计游戏时,经常为减少1k空间大小而大伤脑筋。另外,就是需要准确了解该手机允许的色彩数、分辨率、整屏刷新率,其实这也是对游戏引擎的一种测试。
以motoracer3d为例,我们设想使其运行在nokia9210、nokia7650/3650、sonyericssonp800、pocketpc平台上。在数位红,由于我们拥有了自主开发引擎dragonbonegameengineformobilephone,游戏引擎是跨平台的,所以这一步骤我们就省去了不少时间。我们以nokia7650/3650为最初调试蓝本,原因是在这些设备中,nokia7650/3650的速度相对较慢,屏幕尺寸也相对其他设备小,因此以它为基础设备最为合适。
如下表,我们设计了motoracer3d的基本技术参数。
技术参数达成目标及要求
图像刷新速度>18/fps
文件安装完成大小<1000k
文件未安装大小<400k
占用内存峰值<700k
使用过程中游戏占用内存<700k
游戏与操作系统兼容性nokia9210、nokia7650/3650、sonyericssonp800、pocketpc
游戏图形特效清单无alpha
图形文件
声音文件.wav
数据自定义
目录结构/变动文件清单
使用的动态链接库未知
下面是经过初步估计的基本图片清单:
跑道外面的沙地草地元素
跑道的边上的指示方向的牌。(左右)
跑道地面元素
背景的天空图。
起跑线。
选择的时候得车图(4张)
比赛开始前站立的背面图(4张)。
比赛时候得车加人背面图(4套,每套9张,分别9个角度,从直立开始,每15度一张。)
撞车后的图(3桢)
比赛完毕名次画面。
速度仪表图。
数字(0至9等宽横排,分别有4套,速度数字,档位数字,排位数字)
菜单背景
topten
按钮
巡回赛排名的背景
c.准备游戏策划
很多开发者认为,手机游戏的策划不重要,这个观点是严重错误的,手机游戏的美术与程序开发工作量都非常有限,其表现力也受非常大的制约,因此一款手机游戏的可完性如何在某种意义上完全取决于游戏策划本身。
在此过程中,手机游戏策划基本同传统游戏策划无异。但游戏策划必须要对游戏的操作做出准确的设计,每个手机的键盘都不太相同,毕竟pc上的键盘基本都是101键。
再就是根据上面第一步给定的美工空间限制,美工要同策划共同商议,严格计算每张图片占用的空间,甚至是一个小图标都是不可以漏掉的。
以motoracer3d为例,我们的游戏策划做了大量有关物理力学方面的公式,使其美工在设计图片时更符合真实的效果。
如下表:我们将每种赛车的速度特性均体现出来。
gear1gear2gear3gear4gear5grip颜色
车1最大速度(mph)971071351561760.45绿黄
加速度(mph/秒)211816128
车2最大速度(mph)901021271481680.25紫黄
加速度(mph/秒)2320181410
车3最大速度(mph)1021121401601800.65蓝黄
加速度(mph/秒)201613107
车4最大速度(mph)941051331521720.35黄蓝
加速度(mph/秒)221917139
车5最大速度(mph)1041151451661820.75黑红
加速度(mph/秒)191714107
车6最大速度(mph)921051331521780.5红黄
加速度(mph/秒)211815118
d.美术及程序开发工作
motoracer的贴图设计
建立摩托车的模型与赛手
调整运行时的动作
另外最重要的就是如果想做一款motoracer这样的游戏,首先自己就应该是摩托车的行家,我们motoracer3d的首席美术设计师王科,就是一个疯狂的摩托车发烧友,他可以为了攒钱买机车,啃一年的馒头。呵
e.demo测试
测试工作以motoracer3d为例,我们开发周期6个月,因为有了引擎的缘故,使主代码开发周期缩短至3个月,为了保证这款产品具备国际水准,剩余的3个月我们基本都在找问题、鸡蛋里挑骨头。于是一款位列全球手机游戏销售前三名的motoracer3d终于出炉了。
当然,在数位红像motoracer3d的幸运产品并不多,数位红有30%的产品在demo期间就因为可完性、操作感等问题最终没有面世。毕竟想要打造一个优秀的品牌是要做出很大牺牲的。
iii.手机游戏制作宝典
由于手机硬件设备方面的诸多限制和性能差异,我们在游戏的开发和制作过程中无法天马行空般的进行创作,而不得不综合考虑到多方因素的平衡。下面列出的是一些关键的性能参数,这些参数都直接影响游戏的效果。
分辨率
手机的屏幕大小各有不同,从80*30到320*240,就好比在pc发展过程中的cga、ega乃至vga,分辨率的高低直接导致了造型的大小及表现力,这点相信每个设计人员都有所体会。另外,由于手机型号及操作系统的多样性,导致了一款游戏并不能不加改动的在不同的手机上运行。对于美术设计人员而言,就要在设计之初考虑屏幕的自适应问题。比如在128×128分辨率下与200×200的分辨率下,如何可以不重新更换图片,但又达到同样的效果?
色彩数量
目前手机能达到的色彩数量也是限制美术人员发挥的一个重要瓶颈。从过去几年的黑白屏幕手机到现今256色、4096色及真彩色。digital-red在开发游戏时接触过非常多的手机,其中有的手机号称能显示4096色,但我们将一张4096色的色阶图进行显示,便发现有的颜色根本无法区分,更让人吃惊的是,个别手机还色偏严重。所以,设计人员是一定要根据实际手机进行图片绘制,在此,digital-red有过非常多的教训。
明亮度
液晶屏幕由于其独特的发光原理,并不能达到传统显示器的亮度,同时也就导致了很多色彩丰富的图案在强光下,不能显示出原有的效果,这点在手机户外显示时尤其明显。因此设计人员在设计手机游戏图片时一定要考虑这点,不能将色彩对比度设置的过于接近、图片设计一定要简洁明快,避免过小的图片。
显示速度
在我们接触的手机里,很多由于运算速度的问题,导致动画帧数并不能流畅,甚至达到不了10帧/秒,这对于游戏动画而言是致命的,我们一般采取局部刷帧或者尽量避免全屏幕动画来尽量达到预期效果。而且液晶屏幕本身也有显示速度问题,我们就发现过很多手机都有影像“拖尾”情况。这种情况,在实际游戏中很容易造成玩家的视觉疲劳,尤其在颠簸的车上或者是行动中,游戏时间过长,就有头晕目眩的感觉。如此,即使是一款优秀的游戏也无法留住玩家了。
电力
由于手机是液晶屏幕,大多数设备在高亮度的像素显示与一般像素显示上,两者耗电量是有所区别的,例如白色背景就要比黑色背景消耗更多的电池能量。因此,对于手机游戏而言,要尽可能节省玩家的电池,也算是对玩家的一种体贴吧。
手机游戏开发过程中的一些错误观念
很多想开发手机游戏的朋友们对于手机游戏都充满了幻想,digital-red也曾与这些朋友们一样,在脑海中有非常多的想法等待实现,但一旦真正开发游戏的时候我们就发现很不现实,这里将几个常见的错误认识与诸位分享:
移植pc游戏到手机上
pc上的游戏已经以百兆来计算其占用空间了,而很多手机游戏是以k来计算,大多数的手机游戏能安装60k的游戏就算不错了。
j2me游戏不用改动可以运行在各种手机上
j2me在移动设备上有一个midp1.0标准,但各个手机厂商在推出支持j2me的手机上都对其进行了扩充甚至改动,一个程序想要达到最理想的效果就一定要针对不同型号的手机。
用java开发手机游戏要比用c++好
使用java开发手机游戏的确非常方便,但在效果与性能上很难与c++代码实现效果比拟。如在symbianos/wince设备上我们还是推荐尽量使用c++来开发为好。
java开发出的应用程序占用的空间小
在开发小型应用时,java程序的确空间占用较小,但如果游戏项目过大,java游戏的小巧优势就很难体现了。
手机游戏策划与传统游戏策划无异
手机游戏的策划禁忌非常多,要求策划人员必须全面了解手机的技术性能才能做出针对性的优秀游戏。
美术可以画大图,然后再缩小
一张大图如果缩成12*12大小,效果就可想而知了。
1.Construct3
适合小白的一款游戏开发软件,不需要自己编程,游戏开发工具完全由GUI驱动,游戏逻辑和变量使用应用程序本身提供的设计功能实现。
2.GameMakerStudio2
与Construct3一样,GameMakerStudio2允许您使用其变量和游戏逻辑的拖放界面创建整个游戏。但与Construct3不同,GameMakerStudio2通过其GameMaker语言赋予更多功能,目前它是最流行和最活跃的免费游戏开发引擎之一。
3.Unity
Unity最初是一个3D引擎,但最终在2013年增加了官方的2D支持。尽管它完全能够创建2D游戏,但是你可能遇到偶然的错误或故障,因为Unity的2D系统实际上已经加入其核心3D系统。这也意味着Unity给2D游戏增加了许多不必要的麻烦,这可能会影响性能。
4.戈多引擎
Godot支持创建2D和3D游戏。然而,与Unity不同,戈多的支持要好得多。引擎的2D方面从一开始就经过精心设计,这意味着更好的性能,更少的错误以及更整洁的整体工作流程。
5.虚幻引擎4
在此列表中的所有工具中,UE4是最专业的。它是由Unreal特许经营背后的天才创建的,他们知道顶级引擎需要什么,以及提供下一代功能需要什么。他们确切地知道他们在做什么。
"
以上的文章内容如何使用Unity3d粒子实现拖尾效果就是小编最近整理出来的,大家可以互相讨论吐槽发表自己的观点哦~!查看更多相关文章请访问学分高考(本文共20095字)