Unity 3d 中游戏体销毁时 ,unity屏幕渐变效果果

热门关键词:
热门关键词:
unity3d制作游戏
学费:咨询 优惠价格:咨询
开课时间:0
学时:0 浏览量:
授课机构:
上课地点:广州市海珠区晓港中马路130号之19(广州市特种证件制作
CGWANG王氏动漫教育
动漫培训,原画培训,插画培训,游戏开发培训,MAYA培训,UI培训
游戏设计去哪学-让游戏设计更生动的润色技巧
&&&&&& 你制作了一款很棒的游戏。其机制无懈可击,首个用户流程也很出色,人们马上就知道怎么玩游戏,但不知何故你的游戏还是有点不对劲。因为玩家首先接触到的是游戏的控制器,设计师就不得不费心思优化游戏体验,这种对游戏体验感的调整通常会涉及游戏润色这个概念。
  什么是游戏润色?
  这个概念是指为一款可行的游戏增加满意层次从而提升游戏感。满意度源于感觉,每种视觉和声音输入都有可能令以虚拟方式运行的东西变得富有可信度。这并不是创造真实感的艺术,而是令游戏更具生动性的幻术。这就好比是游戏设计师在压榨一枚开胃果的汁液。你能够感觉到在那些吊人胃口的文字下潜藏着一个强大的游戏设计理念。这是设计师可用于提升游戏感的一个特殊视角。
  当用户体验设计遵从客观原理和规则时,游戏活力就会更具个性化和富有情感。你们对游戏的优化方式可能不尽相同,每位开发者都应该有自己专属的润色技巧。例如,Vlambeer就是创造屏幕震撼感的大师,而PopCap则是生动界面的典范,许多其他开发者的游戏中都贯穿着他们自创的风格。
  从游戏开发者角度来看,这种润色技巧主要取决于2个层面:动画和音频。
  渐变的艺术
  渐变是使用计算机在两个极端值之间进行插值的过程。线性插值是我们所接触的最基本也是最常用的渐变方法。在动画动动方面,线性插值只会产生索然无味的结果。这很正常,要知道现实世界中没有什么东西会完全采用线性方式运行。
  优秀的渐变方法取决于出色地运用12个动画原则。理解动画基本原则是关键,这需要一定的训练。但是,我们还有一些常用工具可以轻松实现渐变感:缓冲(easings)。
  缓入缓出
  正如之前所言,在现实世界中几乎没有什么东西会以线性方式运行。要加快速度或创造惯性就需要再加把劲。运动中的对象总需要一些时间才能达到最大速度,或者完全停止下来。
  我们想重塑自己游戏中每个运动对象的惯性感。这也是我们传递游戏世界中每件物体重量感的最佳方法。
  那么缓冲是什么意思呢?它是用于逐渐插入2个值之间的函数集。缓冲为我们提供了一个表现惯性的便捷方法。缓冲方程可以用多种加速或减速曲线插入2个值。我们有许多缓冲类型,有些奇特的函数可以产生极为有趣的结果,例如弹跳/拉升公式。你可以在easings.net网站上找到许多常用的方程。
  你可以看到每个方程都有3个变量,这可以用于:
  *缓入,在开始时加速
  *缓出,在最后减速
  *两者皆可
  你可能想让一个正在出现的动画缓出,尤其是UI元素。当它落入屏幕画面时,你想让游戏logo优雅地减速落入其最终位置。你可以将移动中的UI元素视为一个角色:它在移动状态的最初进行加速,而后以恒速方式移动,然后在停止之前稍稍滑行一下(缓出)。
  该何时使用特定的缓冲类型?这要取决于你的需求!
  你应该靠自己的速度感和计时感来选择缓冲类型。如果你想创造粗鲁的移动感,那就要选择指数缓冲。如果你需要柔和的移动感,就可以选择更简单的二次缓冲。只需要问问自己,我想为玩家创造哪种情感体验?
  理解和掌握渐变的最佳方法就是观察其他开发者的运用试。最快捷的学习方法就是充分研究同行的作品。
  润色需用于增强核心机制
  游戏润色通常是指用于优化玩家体验的技巧。但这和使用现成的方法并不是同一回事。游戏润色必须响应游戏的核心玩法。我们无法随心所欲地提升游戏体验。屏幕震撼,挤压和拉升,弹跳感和其他快速动画只适用于特定情形!它们在动态游戏中较为常见。
  而在故事导向型的游戏,或者在恐怖游戏中,你所需要的动画可能需要巧妙地传递一种神秘感。你无法使用搞笑的弹跳方程。你所采用的渐变幅度和节奏都会因为项目需求而产生巨大差别。
  我认为润色的意义就在于强化原有的玩法。在Vlambeer的射击游戏中,其开发者所采用的润色方法相当直观:就是要让玩家获得一种力量感。你也可以通过增加的大小,让速度更快,在射击时增加一些后座力等方法来制造这种感觉。
  那么其他类型的游戏该怎么办?每种题材和故事都可以视为不同的果实:它们都该有自己独有的果汁。让我们先看看另一个层面的内容:
  在提升游戏体验的过程中,音频是常被人们忽视的一个环节。至少低预算的独立开发者即是如此。但它却能够快速提升游戏反馈。优质的音频可以强化游戏中任何交互行为的存在感和可信度。糟糕的音频设计却可能摧毁一款游戏。
  你应该格外重视与游戏玩法相关的声音内容。玩家所执行的一切交互行为都要有明确的音频反馈,要让这些声音听起来圆润而饱满。换句话说,你要找到一种音感并想想这些音调如何传递一种存在感或作用。在休闲游戏中,多数音调具有愉悦性,富有旋律而令人兴奋。每种声音听起来都令人愉快并且能够丰富积极的体验。这方面可以看看《TwinGo!》所有菜单上的交互行为如何创造出欢乐感,堪比任天堂游戏的音频质量。在创造类似于《The Room》这种空间游戏时,很有必要用寂静或近似于寂静的状态来创造一种强烈的音量变化,以便突出神秘或险恶感。
  这些声音与玩法相关,所以是你音频设计中的重要元素。它们在某种程度上是我们的核心音频设计。但游戏的主要音效并不足以创造引人入胜的听觉体验。我们仍需要考虑音轨的问题。
  音乐的力量
  音轨可能是我们创造情感的一种最有效的工具。虽然我们每天都沉浸在音乐中,但却未必了解音乐的构成技巧。音乐有点神秘和不可思议,它可以改变我们的心情,让我们精神振奋甚至是陷入怀旧之情。
  我在之前的文章中曾提到《Xenoblade》强大的标题画面。如果你一直盯着这个精美的画面,任由场景渗入,就会发现它会触动你的心弦。我建立你关掉音频看看这个视频,看看还会不会产生同样的感觉。你会发现画面的确很美……但就是缺乏情感。
  在声音设计和动画制作领域中,开发者需具备一定的经验才能更好地理解出色音轨的特征。我在这方面的建议就是不要忽视音乐的力量。你可以找一些优秀的作曲家和音乐制作人来帮你解决这个问题。如果你真的想做出好游戏,那就一定要聘请一名专业人士!
  对于所有游戏来说,拥有可靠的玩法音效和音乐都是一个必不可少的基本条件。音景是一种较不常用的声音类型——开发者预算不足的情况下尤其如此。音景是一种意在将玩家引入游戏世界的音轨。
  要让玩家沉浸在游戏世界中,就很有必要增加与场景氛围相对应的声环,即使当时游戏中已经在播放音乐!音景的作用并非让玩家有意识地倾听音乐,但它会逐渐淡入背景。玩家不必“听到”,只会“感觉”到音景。
  玩家正淌水过河?水流声就应该柔和地与游戏音轨混合在一起。玩家在穿过烟囱?你可以用一些较轻柔的爆裂声来创造火苗燃烧的感觉。背景音频有助于开发者优化玩家体验。
  常用的润色效果
  你为游戏润色的方法要视项目具体情况而定,以下是适用于多数项目的一些常用视觉特效技巧(多数取决于粒子系统):
  第一个方法就是,游戏中的两个子画面无论何时发生碰撞时都要使用动画特效。这可以是:
  *角色着陆或奔跑时扬起灰尘。这是一种可让角色与游戏世界融为一体,并令其脚步更具重量感的有效方法。
  *火花或星星。这是一种在两个对象发生碰撞时,创造一种冲击感的简单方法
  让游戏暂停半秒也是一种极有利于强调碰撞感的方法。你可以适当延长暂停时间,仅玩家的攻击或死亡更具影响力。这实际上就是我们所谓的hold这种常用的动画技巧。可以让角色动画的关键姿势hold住几帧时间从而强化效果。这可以为观众的大脑腾出数秒时间来处理某个动画的最重要时刻。
  痕迹是另一个常用特效,可用于强调对象的运动弧线,对于快速移动的对象尤其适用。例如,我们常可看到发生以下情况:
  *在刀剑或武器砍杀的动画中,在攻击过程中快速消失的痕迹可以创造出一种刀光剑影的效果。
  *快速奔跑的角色身后所出现的痕迹。
  需要注意的是痕迹会令对象移动速度变慢。非动画制作人员可能无法直观地感受到这一点,但痕迹的确会干预动画。也就是动画师所称的“污点”(smears)。痕迹或污点将对象当前的姿势和数帧前的位置混淆起来。所以要慎用这一招!
阅读上一篇:阅读下一篇:暂无
本培训机构相关资讯
··········
培训机构联系方式
本培训机构其他课程
···············
如何选择一对一课外辅导班?
  如果您的孩子在学习上存在这样那样的问题,您不妨拨打一个400免费咨询***,找教育专家聊聊,也许仅仅几分钟的免费***就将改变您孩子的未来。点击您所在市查询本地名师一对一辅导400免费咨询***:  
【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】
三百六十行,欢迎各培训机构加盟Unity3D--学习太空射击游戏制作(三) - IT大师
& 18:13:00
步骤四:创建敌人
创建敌人的方式与创建主角类似,不过敌人的行为需要由计算机来控制,它将从上方迎着主角缓慢飞出来,并左右来回移动:
01:创建Enemy.cs脚本,添加代码:
1 using UnityE
2 using System.C
4 [AddComponentMenu("MyGame/Enemy")]
5 public class Enemy : MonoBehaviour
//移动速度
public float m_Movespeed = 1;
//旋转速度
public float m_RotationSpeed = 30;
public Transform m_
void Start()
m_transform = this.
void Update()
UpdateMove();
protected void UpdateMove()
//左右移动
float rx = Mathf.Sin(Time.time) * Time.deltaT
m_transform.Translate(new Vector3(rx, 0, -m_Movespeed * Time.deltaTime));
UpdateMove函数用来执行敌人的移动,使用了Sin函数使游戏体在x方向的移动始终在(-1,1)区间内,敌人在飞行的同时还会左右迂回;在Project窗口找到Enemy.fbx文件,拖动到Hierarchy窗口,然后参考前面内容为其创建Prefab,指定Enemy脚本作为其组件。然后将Prefab从Project窗口拖动到游戏场景中,然后在Hierarchy窗口选中Enemy按Ctrl+D复制多个,然后再Scene窗口中自己排列下位置就OK了。
游戏运行后:
步骤五:添加物理碰撞
现在的游戏虽然有了主角、敌人,也可以发射子弹,但主角和敌人之间却没有任何的交互。我们需要分别给主角、子弹、敌人添加碰撞体,并添加触发碰撞的代码,使其在发生碰撞的时候产生交互。
01:先给敌人添加碰撞体,在Scene面板选中任意一个敌人,在菜单栏选择Component-&Physics-&Box Collider为敌人添加一个立方体碰撞体组件,在后在Inspector窗口找到Box Collider组件,选中Is Trigger,使其具有触发作用:
02:接着在菜单栏选择Component-&Physics-&Rigidbody为敌人添加一个刚体组件,所有需要参与物理计算的游戏体都需要有一个刚体组件才能正常工作。在Insperctor-&Rigidbody取消选择Use Gravity去掉重力作用影响,选中Is Kinematic使游戏体运动不受物理模拟影响,现在已经为一个敌人添加了物理碰撞效果组件,然后再Insperctor最上面找到Apply按钮点击,这样所有的Enemy都更新了此物理碰撞的设置。此处如果是在编辑器的Project窗口修改原始敌人的Prefab的属性,那么场景中的所有的敌人都会自动更新与Prefab一样的属性设置,如图:
然后参考给敌人设置物理碰撞组件的做法,给主角和子弹也类似的设置。
03:接下来触发碰撞,上面已经给主角、敌人、子弹添加了碰撞体,但是运行游戏的时候看不到任何的互动效果,我们将要为他们分别指定一个Tag标识,然后添加触发碰撞事件的代码,在菜单栏选择Edit-&Project Settings-&Tags在size中输入2,创建两个tag,名为PlayerRocket和Enemy,如图:
然后在Project窗口选择敌人的Prefab,在Inspector窗口设置Tag为E选择子弹的Prefab,在Inspector窗口设置它的Tag为PlayerR选择主角设置他的Tag为Player,这个Tag是Unity预设在工程内的。
然后打开敌人Enemy.cs脚本,添加一个生命属性:
public float m_life = 10;
void OnTriggerEnter(Collider other) //这是一个派生自MonoBehaviour的函数,在碰撞体互相接触时
//会被触发
if (pareTo("PlayerRocket") == 0)//如果碰到的物体是主角子弹PlayerRocket
Rocket rocket = other.GetComponent&Rocket&();//获得对方碰撞提的Rocket脚本组件
if (rocket != null)
m_life -= rocket.m_
if (m_life &= 0)
Destroy(this.gameObject);//如果生命小于等于0就自动销毁
else if (pareTo("Player") == 0)
m_life = 0;
Destroy(this.gameObject);//如果碰到主角就立即自动销毁
  然后在子弹Rocket.cs脚本中也添加一个OnTriggerEnter函数,当子弹撞击到敌人,则自我销毁。
void OnTriggerEnter(Collider other)
if (pareTo("Enemy") == 0)
Destroy(this.gameObject);
  然后在主角Player.cs脚本中添加一个生命属性,添加一个OnTriggerEnter函数,当主角与非自己发出的子弹相碰撞的时候都会损失一些生命,当生命为0时候自行销毁。
public float m_life = 3;
void OnTriggerEnter(Collider other)
if (pareTo("PlayerRocket") != 0)//如果主角与非己方子弹相撞
m_life -= 1;
if (m_life &= 0)
Destroy(this.gameObject);
  此时我们注意到当敌人没有与主角或者主角的子弹发生碰撞的时候就会一直存活,从而造成了资源的浪费,这时候我们需要添加一个空的游戏体,把他放到最下面,然后让他的范围可以控制到整个下方横向区域,添加物理碰撞组件,为他指定一个名为Bound的Tag,然后在Enemy.cs中添加一句代码,当敌人没有被子弹消灭和主角碰撞消灭的时候飞到屏幕下方与之碰撞就会自行销毁。
else if (pareTo("Bound") == 0)
m_life = 0;
Destroy(this.gameObject);//如果碰到边界就立即自动销毁
  步骤六:添加高级敌人(可以向主角发射子弹的敌人)
01:在Project窗口找到Enemy2.fbx模型,为其创建Prefab,为其创建脚本SuperEnemy.cs,该类继承自Enemy.cs,然后打开Enemy.cs,,将UpdateMove()方法写成Vitual方法,然后再SuperEnemy.cs中重写该方法,同时将新敌人的Tag改为Enemy:
using UnityE
using System.C
[AddComponentMenu("MyGame/SuperEnemy")]
public class SuperEnemy : Enemy
protected override void UpdateMove()
//向前移动
m_transform.Translate(new Vector3(0, 0, -m_Movespeed * Time.deltaTime));
  此时运行游戏发现新敌人缓慢向前移动
02:新敌人向主角发射子弹
使用rocket.fbx创建一个新的子弹Prefab,取名为EnemyRocket,为其创建新的材质,使用rocket2.png作为贴图,使敌人的子弹看上去与主角的子弹不同,为敌人添加RigidBody和Box Collider组件(这里我添加组件的时候子弹就发不出来了,不知道为啥???),为敌人子弹新建一个名为EnemyRocket的Tag,创建EnemyRocket.cs脚本,继承自Rocket类:
using UnityE
using System.C
[AddComponentMenu("MyGame/EnemyRocket")]
public class EnemyRocket : Rocket
void OnTriggerEnter(Collider other)
if (pareTo("Player") == 0)
Destroy(this.gameObject);
  将EnemyRocket的脚本指定给敌人子弹的Prefab,在Inspector窗口设置EnemyRocket组件,降低敌人子弹的移动速度,增加生存时间,然后关联SuperEnemy和子弹,在SuperEnemy.cs脚本中添加代码:
using UnityE
using System.C
[AddComponentMenu("MyGame/SuperEnemy")]
public class SuperEnemy : Enemy
public Transform m_
protected float m_fireTimer = 2;//控制发射子弹的时间间隔
protected Transform m_//用来指向主角的飞船
void Awake()//Awake方法继承自MonoBehaviour它会在游戏体实例化时执行一次,并先于Start方法
GameObject obj = GameObject.FindGameObjectWithTag("Player");//获得主角的游戏体实例
if (obj != null)
m_player = obj.
protected override void UpdateMove()
m_fireTimer -= Time.deltaT
if (m_fireTimer &= 0)
m_fireTimer = 2;
if (m_player != null)
Vector3 relativePos = m_transform.position - m_player.
//Quaternion.LookRotation使子弹在初始化时朝向主角的方向
Instantiate(m_rocket, m_transform.position, Quaternion.LookRotation(relativePos));
//向前移动
m_transform.Translate(new Vector3(0, 0, -m_Movespeed * Time.deltaTime));
  然后选择SuperEnemy的Prefab,在Inspector窗口中选择Rocket属性,与敌人的子弹的Prefab相关联,然后运行游戏。
注意:我在添加子弹游戏体的时候如果是添加了Box Collider就会看不到子弹了,不知道是不是坐标的问题??????
下面是添加声音和特效...
&本文转自:
文章链接:
原创说明:转载原创文章时请保留原文链接,谢谢!
转载说明:本站转载文章均标明文章来源,若本篇转载侵犯了您的权益,请联系站长删除!
交流Q群:
开源组件:、

参考资料

 

随机推荐