Unity之做一个最简单的FPS游戏demo

目录

😋FPS游戏Demo

💤1.新建FPS模板项目

⚒️2.装备枪 

💣3.设置射击功能

📺4.制造一个子弹预制体 

🎮5.发射子弹


说起来小编学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^)┛ 

  • 42
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
制作一个动作游戏Demo需要考虑角色控制、动画、物理引擎等方面的内容。以下是一个简单Demo示例: 1. 角色控制 首先,我们需要创建一个角色模型,并为其添加一个角色控制器组件,例如Character Controller或Rigidbody等。然后我们需要编写一个角色控制器脚本,用于处理玩家的输入和控制角色行动。例如: ``` public class PlayerController : MonoBehaviour { public float moveSpeed = 10.0f; public float rotateSpeed = 3.0f; private CharacterController controller; private Vector3 moveDirection = Vector3.zero; void Start() { controller = GetComponent<CharacterController>(); } void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); transform.Rotate(0, horizontal * rotateSpeed, 0); moveDirection = new Vector3(0, 0, vertical); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= moveSpeed; controller.Move(moveDirection * Time.deltaTime); } } ``` 在这个例子中,我们使用Character Controller组件来控制角色的行动,使用Input.GetAxis()函数获取玩家的输入,使用transform.Rotate()函数实现角色的旋转,使用controller.Move()函数实现角色的移动。 2. 动画 创建一个角色模型后,我们需要为其添加动画。可以使用Unity自带的Animator组件来管理动画状态机,并根据角色的状态转换来播放不同的动画。例如: 在Animator Controller中创建多个状态,例如Idle、Run、Attack等,并设置不同的过渡条件。然后在角色控制器脚本中,根据角色的状态转换来设置Animator Controller的参数,例如: ``` public class PlayerController : MonoBehaviour { public Animator animator; void Start() { animator = GetComponent<Animator>(); } void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); if (vertical > 0.1f) { animator.SetBool("isRunning", true); } else { animator.SetBool("isRunning", false); } if (Input.GetKeyDown(KeyCode.Space)) { animator.SetTrigger("attack"); } } } ``` 在这个例子中,我们使用animator.SetBool()函数和animator.SetTrigger()函数来设置Animator Controller的参数,例如"isRunning"参数和"attack"参数,以触发不同的动画状态。 3. 物理引擎 最后,我们可以使用Unity自带的物理引擎来实现一些特殊的效果,例如碰撞、击退等。例如,可以为角色模型添加一个Rigidbody组件,并在角色控制器脚本中使用AddForce()函数来实现击退效果。例如: ``` public class PlayerController : MonoBehaviour { public Rigidbody rigidbody; void Start() { rigidbody = GetComponent<Rigidbody>(); } void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Enemy")) { Vector3 direction = collision.contacts[0].point - transform.position; direction = -direction.normalized; rigidbody.AddForce(direction * 500.0f); } } } ``` 在这个例子中,当角色模型与敌人碰撞时,我们使用AddForce()函数来实现击退效果,例如让角色模型向后飞出。需要注意的是,这个例子只是一个简单Demo示例,实际应用中可能需要更复杂的物理效果和碰撞检测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值