目录
说起来小编学Unity差不多一个月了,都是利用上班摸鱼时间学的(doge.jpg)。今天终于迎来了一直想做的FPS游戏demo。
【10分钟制作第一人称射击游戏 - Unity游戏开发】 小编是根据小破站这个教程学的,好的教程分享给大家,然后在此基础上小编还加了子弹拖尾和开火特效。
下面小编以博客的形式教大家做这个游戏demo,角色控制器是项目模板自带的,我们只需要加上枪编辑好发射子弹功能就可以了,非常简单。
😋FPS游戏Demo
💤1.新建FPS模板项目
首先我用的Unity HUB版本是3.3,我们可以直接新建一个FPS模板项目:取好项目名创建项目。
创建好进入项目后场景模板都给我们建好了,运行项目就能发现我们通过WASD和空格键控制胶囊玩家行走和跳跃。
⚒️2.装备枪
射击类游戏怎么能没有枪呢???我们去资源商店找一把
选了这一把枪在Unity中打开把它导进项目中来
资源导进来后查看枪的预制件,选择一把你喜欢的颜色:
如果发现枪的预制件是紫色的我们通过下面方式来解决:
解决好材质问题后选择喜欢的枪装到玩家的摄像机(PlayerCameraRoot)上,这样控制玩家视角旋转枪也会跟着旋转。装备好枪后我们还要调整枪到合适的位置。
保存后运行就可以看到玩家拿着枪移动了。
💣3.设置射击功能
有了枪之后我们还要用它射击,先设置一下操作按键(鼠标左键):设置好后保存。
下面我们来验证射击按键有没有触发操作, 双击打开脚本文件(StarterAssetsInputs)
我们使用bool类型来判断是否按下,
using UnityEngine; #if ENABLE_INPUT_SYSTEM && STARTER_ASSETS_PACKAGES_CHECKED using UnityEngine.InputSystem; #endif namespace StarterAssets { public class StarterAssetsInputs : MonoBehaviour { [Header("Character Input Values")] public Vector2 move; public Vector2 look; public bool jump; public bool sprint; //射击 public bool shoot; [Header("Movement Settings")] public bool analogMovement; [Header("Mouse Cursor Settings")] public bool cursorLocked = true; public bool cursorInputForLook = true; #if ENABLE_INPUT_SYSTEM && STARTER_ASSETS_PACKAGES_CHECKED public void OnMove(InputValue value) { MoveInput(value.Get<Vector2>()); } public void OnLook(InputValue value) { if(cursorInputForLook) { LookInput(value.Get<Vector2>()); } } public void OnJump(InputValue value) { JumpInput(value.isPressed); } public void OnSprint(InputValue value) { SprintInput(value.isPressed); } //射击 public void OnShoot(InputValue value) { shoot = value.isPressed; } #endif public void MoveInput(Vector2 newMoveDirection) { move = newMoveDirection; } public void LookInput(Vector2 newLookDirection) { look = newLookDirection; } public void JumpInput(bool newJumpState) { jump = newJumpState; } public void SprintInput(bool newSprintState) { sprint = newSprintState; } private void OnApplicationFocus(bool hasFocus) { SetCursorState(cursorLocked); } private void SetCursorState(bool newState) { Cursor.lockState = newState ? CursorLockMode.Locked : CursorLockMode.None; } } }
我们来创建自己枪的脚本(Gun)并挂载到枪上,我们用来测试射击键是否生效:
using System.Collections; using System.Collections.Generic; using UnityEngine; using StarterAssets; public class Gun : MonoBehaviour { private StarterAssetsInputs _input; void Start() { _input = transform.root.GetComponent<StarterAssetsInputs>(); } void Update() { //判断是否按下射击键 if (_input.shoot) { //打印shoot! Shoot(); _input.shoot = false; } } void Shoot() { Debug.Log("shoot!"); } }
运行项目点击鼠标左键查看是否生效
📺4.制造一个子弹预制体
新建一个球体取名为Bullet,把它缩放成子弹的形状,小编新建了一个橙黄色的材质给子弹上色,并给子弹加了刚体Rigidbody和拖尾组件TrailRenderer。
注意调整拖尾的宽度、时间和颜色,有条件的也可以加上拖尾材质😋
Unity之预制体与变体 通过这个我们知道层级里的物体往项目栏下面拖就会生成预制体,我们来生成子弹预制体。
我们还要创建一个空对象(BulletPoint),把它放到枪口位置,这个空对象用来标记子弹的生成点。
🎮5.发射子弹
这里小编放上脚本(Gun)的全部代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; using StarterAssets; public class Gun : MonoBehaviour { private StarterAssetsInputs _input; //子弹预设体序列化 [SerializeField] private GameObject bulletPrefab; //游戏对象子弹发射点 [SerializeField] private GameObject bulletPoint; //子弹速度 [SerializeField] private float bulletSpeed = 999; //特效 public GameObject muzzleFlash; // Start is called before the first frame update void Start() { _input = transform.root.GetComponent<StarterAssetsInputs>(); } // Update is called once per frame void Update() { //如果按下射击键执行Shoot方法 if (_input.shoot) { Shoot(); _input.shoot = false; } } void Shoot() { Debug.Log("shoot!"); //生成一个子弹实例,每点击射击一次则生成一枚子弹 GameObject bullet = Instantiate(bulletPrefab, bulletPoint.transform.position, transform.rotation); //给子弹一个向前的力 bullet.GetComponent<Rigidbody>().AddForce(transform.forward * bulletSpeed); //一秒后销毁子弹 Destroy(bullet,1); //发射子弹的同时并播放开火特效 PlayerFireEffect(); } /// <summary> /// 播放开火特效 /// </summary> public void PlayerFireEffect() { //启动特效 muzzleFlash.SetActive(true); //0.2秒关闭 Invoke("UnEffect", 0.1f); } /// <summary> /// 取消特效 /// </summary> private void UnEffect() { muzzleFlash.SetActive(false); } }
(插个眼)小编已经把开火特效预制体上传到资源了,审核通过后在这里更新链接。
链接来了:https://download.csdn.net/download/qq_48512649/88797719
我们把开火特效(MuzzleFlash)也放到枪下边,和子弹发射点(BulletPoint)处在同一级,并把开火特效放到合适的位置。
放好后我们要取消开火特效(MuzzleFlash),因为只有我们点击开火的时候才会触发。
然后我们给脚本(Gun)装填子弹(Bullet)、子弹发射点(BulletPoint)、子弹速度(BulletSpeed)和开火特效(MuzzleFlash)。
小编再给加一个准星,不过这个准星可能因为子弹发射点位置的原因不是很准(doge.jpg)
新建一个图像,然后根据下图的数据设置好,还可以选择自己喜欢的颜色,这样准星就设置好了。
点击运行项目就是本篇开头演示的效果了,当然了这只是个demo,真正的游戏还要有敌人血条等元素😃小编还要持续学习。本篇先到这里,完结撒花✿✿ヽ(°▽°)ノ✿,拜拜┏(^0^)┛