发布网友 发布时间:2023-07-06 08:54
共1个回答
热心网友 时间:2024-10-18 10:01
准备工作
首先,请下载一个我为本文游戏建立的初始示例项目,然后把它放到一个你指定的位置。
然后,使用Unity3D打开这个项目,注意到Assets文件夹下包含了好多的子文件夹。
这里具体说一下各个文件夹的主要功能:
AnimationControllers:存储着游戏控制器部分,包括的逻辑部分。
Materials:包含构建各关卡场景所需要的块(Block)材质。
Models:存储玩家、关卡及*模型,及其相关材质。
Music:存储游戏的音效文件。
PhysicsMaterials:存储玩家的物理材质数据,它们是一些特殊类型的材质,用于实现特定的物理属性。在本教程中,用于使玩家在无摩擦情况下轻松地在关卡中穿越。
Prefabs:包含*及爆炸的预制数据。
Scenes:对应于游戏场景数据。
Scripts:包含游戏的启动脚本,其中添加的大量注释将有利于读者阅读源码。
SoundEffects:包含*及爆炸效果相关的声效文件。
Textures:包含两个玩家的纹理数据。
投掷*
如果你还没有打开游戏工程,请抓紧打开,然后试着运行一下此程序。没有其他问题的话,你会观察到如图所示的情形:
你会注意到,游戏中的两个玩家可以通过键盘上的WASD四个字符键或者四个箭头键驱动,使其沿着游戏地图运动。
通常,当按下空格键时红色玩家会在其脚下安置一枚*,而另一个玩家也能够做同样的事情——只是通过按回车键实现。
然而,目前我们还没有实现这一功能。为此,你需要先编写放置*的代码。现在,请你使用自己喜欢的代码编辑器打开脚本文件Player.cs。
此脚本负责处理所有的玩家运动及动画逻辑,还包含一个方法DropBomb,当关联游戏对象(GameObject)bombPrefab时,它用于检测目的。
privatevoidDropBomb(){if(bombPrefab){//Checkifbombprefabisassignedfirst}}1.2.3.4.为了实现一个*掉落在玩家下面的效果,在if语句中添加下面的代码:
Instantiate(bombPrefab,myTransform.position,bombPrefab.transform.rotation);1.上述代码将在玩家脚下生成*(随着玩家的运动路径的变化,将生成成串的*)。现在,运行一下游戏工程,你会观察到如下图所示效果:
目前,效果不错吧!
但是,还有一个小问题:*投掷的方式如何?如果是无论在哪里你都能放*的话,当你需要计算爆炸应该发生的位置时就会带来一些问题。
接下来,本教程将向你具体介绍如何实现爆炸的所有细节。
*定位
下一步任务是确保*在丢掉时能够附着到相应位置,从而实现*很好地与地板上的网格对齐。由于我们的设计中网格上的每个图块大小是1×1,所以进行此更改是相当容易的。
打开文件Player.cs,编辑一下Instantiate()函数,像下面这样:
Instantiate(bombPrefab,newVector3(Mathf.RoundToInt(myTransform.position.x),bombPrefab.transform.position.y,Mathf.RoundToInt(myTransform.position.z)),bombPrefab.transform.rotation);1.2.3.注意,这里函数Mathf.RoundToInt调用中使用了玩家位置的x和z两个参数值,每一个浮点类型值被转换为一个整型值,这就可以实现*很好地与地板上的网格对齐的效果:
现在,你可以再次启动工程来运行一下,你会观察到当投掷*时,这些*恰好能够对齐网格:
虽然把*投掷到地图上是很有趣的,但你知道真正有趣的事是如何实现爆炸!为此,我们再来添加一些功能。
创建爆炸效果
首先,我们要创建一个新的脚本文件:
(1)从Project视图下选择Scripts文件夹;
(2)按下Create按钮;
(3)选择“C#Script”;
(4)把脚本文件命名为Bomb即可。
现在,把Bomb.cs脚本关联到预制Bomb上:
(1)在Prefabs文件夹中选择GameObjectBomb;
(2)点击按钮“AddComponent”;
(3)在搜索框中输入“bomb”;
(4)选择你刚刚创建的脚本Bomb.cs;
(5)打开此脚本文件,然后在其Start()方法中输入如下代码:
Invoke("Explode",3f);1.此方法使用了两个参数,第一个是将要调用的方法名称,第二个是在调用此方法时需要延迟的时间数。在本例中,想实现*在3秒内爆炸的效果。我们将在后面添加这个Explode方法的具体内容。
现在,只是在Update()方法下面添加这个方法占位符形式(目前为空):
voidExplode(){}1.2.在生成任何GameObjectExplosion之前,还需要创建一个公共类型的GameObjet对象,以便进行预制Explosion的赋值。恰好在Start()方法上面定义如下代码:
publicGameObjectexplosionPrefab;1.保存此文件,然后从Prefabs文件夹下选择预制Bomb,然后把预制Explosion拖动到“ExplosionPrefab”选项后面空白处。
完成这一操作后,返回到编辑器中。现在开始编写更有意思的代码。
在方法Explode()中,添加如下代码行:
Instantiate(explosionPrefab,transform.position,Quaternion.identity);//1GetComponent<MeshRenderer>().enabled=false;//2transform.FindChild("Collider").gameObject.SetActive(false);//3Destroy(gameObject,.3f);//41.2.3.4.上述代码实现如下功能:
1.在*位置触发爆炸;
2.禁用网络渲染器(meshrender),使*不可见;
3.禁用碰撞器,从而允许玩家在爆炸中移动与行走;
4.在0.3秒后拆除*;这可以确保在删除GameObject之前所有爆炸都会触发。
现在,保存脚本Bomb.cs,返回到编辑器尝试再玩一下游戏。放下一些*并观察一下它们爆炸时良好的效果,参考下图。
设置爆炸音效
为了创建理想的爆炸效果,你需要创建一个协程。
「补充」协程本质上是一个函数,允许你暂停执行并将控制返回到Unity3D。在以后的某个时间点处该函数将从上次离开的位置恢复执行。
人们经常混淆协程与多线程。其实,它们是不同的:协程运行在同一个线程中,并能够在某中间点处及时恢复执行。若要了解更多的关于协程及其定义相关信息,请查阅相关的Unity文档(