本文将由Adam Sinicki教大家如何使用Unity制作一款3D射击游戏,并且可以直接运行到Android手机。
教程将分为两部分,第一部分讲解基础概念和项目设置。第二部分将在前面的基础上,因为在移动平台开发3D射击游戏会一定的挑战,所以针对会有Android平台进行改善和优化。今天先分享上半部分的内容,明天再继续讲解下半部分。
准备事项
如果您尚未安装Unity,请先至官网下载安装,本文使用Unity 5.3.5f1。首先打开Unity并新建一个3D项目:
点击创建项目,会看到如下画面:
创建游戏世界
下面来创建一个可以让玩家角色四处走动的游戏世界。依次点击菜单项GameObject > 3D Object > Plane新建平面,在场景中会出现一块平面网格,它将作为游戏地图。然后,依次点击菜单项GameObject > 3D Object >Cube新建立方体,使用界面上方的移动工具,将立方体移至平面上方,的工具还可以用来旋转和缩放等。
下面来为立方体添加物理属性,这就需要添加碰撞器(Collider)和刚体(Rigidbody)组件:碰撞器用来进行碰撞检测,刚体则提供一些简单的物理特性如重力和摩擦力等。
在场景视图或层级视图选中立方体后,依次点击检视面板上的Add Component > Physics > Box Collider添加碰撞器(默认已有则无需添加),同样的步骤选择Add Component > Physics > RigidBody添加刚体。
此前已将立方体拖拽至平面上方,点击运行会看到立方体下落至平面后静止。按下Ctrl/Cmd + S保存场景,任意命名为“Level1”或。
场景美化
如果仅在乎游戏功能部分,可以先跳过这一节直接阅读后面的内容。但是,现在的场景看起来不够美观:
首先为平面和立方体添加纹理,使用任意你喜欢的图片即可,Asset Store上也有大量的免费资源。在Assets目录下新建文件夹Scenes和Textures,将此前保存的场景存放在Scenes文件夹下,将要添加的纹理存放在Textures文件夹下。然后将纹理直接拖拽至场景视图上的对象,即可为对象添加纹理:
上图的纹理分辨率看起来不够高,将纹理拖拽至对象时Unity会自动生成Materials文件夹,可以选中Materials文件夹下的材质做一些参数调整,更改Metallic滑块的值,并将Tilling的X和Y值均设为3(表示每个方向重复3次)。
下面来添加自定义天空盒。在Materials文件夹下点击右键Create > Material新建材质,选择Shader类型为Skybox > 6 Sided,设置6张天空盒贴图。如果没有天空盒贴图,也可以选择Shader类型为Procedural使用默认材质。
接着,依次点击菜单项Window > Lighting > Skybox新建天空盒,将刚才新建的材质拖拽至Skybox字段:
效果如下:
添加玩家
这里要用到Unity自带的“FPSController”,右键点击Assets文件夹选择Import Package > Characters。导入成功后,在Assets下会出现“Standard Assets”文件夹。打开Standard Assets > Characters > FirstPersonCharacter > Prefabs,将FPSController拖拽至场景, 删除场景上的主相机。默认的FPSController已经实现了输入、物理碰撞等行为的代码,其中还带有音效。
点击运行,即可使用W、A、S、D来移动玩家,使用鼠标改变玩家朝向,按空格键跳跃。
加入射击
为了效果更逼真,可使用3D型,Asset Store就有大量的免费模型,也可以访问这里下载。新建文件夹Objects,将枪的模型放在此文件夹下。将枪的模型拖拽至场景,放在FPSController上方,并调整枪的大小与方向与FPSController一致。接着,在层级视图中,将枪拖拽至FPSController下作为子对象,现在玩家移动枪即跟随移动。
有了枪,下面来创建。新建Sphere作为,添加Rigidbody组件,并取消勾选Use Gravity,以免发射后下坠。
在Assets下新建文件夹Scripts,在文件夹下新建C#脚本Forward,该脚本用来控制向前移动,代码如下:
[C#] 纯文本查看 复制代码public class Forward : MonoBehaviour { private float timetodestroy; // Use this for initialization使用它来初始化 void Start () { //GameObject.rigidbody.constantForce游戏对象、刚体、恒力 timetodestroy = 3; } // Update is called once per frame逐帧召唤更新一次 void Update () { timetodestroy = timetodestroy - Time.deltaTime; gameObject.transform.position += transform.forward * Time.deltaTime * 30; if (timetodestroy < 0) { Destroy(gameObject); } } }
Transform 表示坐标,上面代码就是让以每秒30个单位的速度向前飞行。浮点数timetodestroy 随时间减小,减至0时消除对象。gameObject表示脚本所绑定的游戏对象。将Forward脚本添加至Sphere球体()上:
新建文件夹Prefabs存放可能需要被多次使用的游戏对象,对象可以包含多个不同属性及脚本。将Sphere拖拽至Prefabs文件夹下存为预设体(Prefab),删除场景中的Sphere。注意:记得保存场景。
在Scripts文件夹下新建C#脚本Fire,代码如下:
[C#] 纯文本查看 复制代码public class Fire : MonoBehaviour { public GameObject blast; // Use this for initialization使用这来初始化 void Start () { } // Update is called once per frame逐帧召唤更新一次 void Update () { if (Input.GetKeyDown(KeyCode.Mouse0)) { Instantiate(blast, gameObject.transform.position, gameObject.transform.rotation); } } }
以上代码表示,每次点击鼠标左键就会在gameObject的位置生成新的游戏对象blast。将该脚本绑定到枪上,将预设体拖拽至脚本的blast字段。玩家点击鼠标左键,就会出现在枪的中心,并开始向前移动。
可以在场景中添加更多的地板和立方体进行测试:
处理射击的方式还有很多,Raycast就是很常见的一种。到此已经实现了在3D世界中走动并射击,下一篇将继续添加瞄准目标和一些动画,加入敌人和关卡,并尝试制作不同的地形,然后针对Android设备选择正确的纹理和触摸控制来优化游戏。
原文连接:http://www.androidauthority.com/ ... ty-part-one-712425/
原文作者:ADAM SINICKI
感谢Unity官方翻译组成员“yushuw”对本文翻译所做的贡献。
转载请注明来源:Unity官方中文社区(forum.china.unity3d.com)。请勿私自更改任何版权说明信息。 Unity, 3D游戏, 入门, 教程
锐亚教育 锐亚科技 unity unity教程
- 还没有人评论,欢迎说说您的想法!