【Unity】第三人称射击游戏开发过程之开火设计(TPS.S.P2)

  • 枪械的开火
    • 开火流程
    • 开火前的准备
      • 实体子弹的准备
    • 开火逻辑

这一章我们来设计基础的枪械功能。

枪械的开火

我现在选择的武器是416,所以数据会是416的一些数据。

开火流程

第一步,要找到枪口。我们之前已经做了瞄准点了,现在只需要让子弹从枪口出现,然后飞向瞄准点。
自然,这个射击逻辑由各位的想法而定。无论是射线射击,或者说实体子弹;无论是从瞄准镜飞出,还是从枪口飞出;无论是以瞄准点为方向,还是以枪口实际朝向作为飞行方向都可以。

开火前的准备

由于我们是从枪口生成实体子弹,所以需要准备子弹实体以及枪口位置。

实体子弹的准备

首先,我们的子弹虽然是实体的,但我们不需要其有模型。我们只希望由可视化的弹道。所以我们的子弹设计是这样子的:
1.由碰撞体与刚体以保证能与其他物体发生碰撞;
2.有弹道。
我们这里主要聊一下弹道。在Unity中有一个TrailRenderer(拖尾渲染器)。我们为子弹添加上这个组件。
这个红色曲线代表我们的拖尾在生存周期中的宽度变化。下边还有诸如颜色的变化,生存时间,材质等。

我们的拖尾在编辑器中拉动一下发现是粉红色的,这代表其未添加材质。我们为其创建一个。创建一个材质,Shader选择Legacy Shaders/Particles/Additive,这个材质代表了其属性是粒子效果。设置一下颜色

好,接下来为拖尾添加上这个材质

我们把它做成一个预制体。枪口就是简单的设置一个空物体挂载在枪口就可以了。

开火逻辑

这段代码我挂在了枪上。
我们首先获取属性

 [Header("Firing")][Tooltip("是否为全自动")][SerializeField]private bool automatic;[Tooltip("子弹飞行速度")][SerializeField]private float _ammoSpeed;[Header("BaseSettings")][Tooltip("枪口")][SerializeField]private Transform muzzle;[Tooltip("瞄准点")][SerializeField]private Transform targetpoint;[Tooltip("子弹")][SerializeField]private GameObject _ammo;private PlayerInputsMassage _inputMessage;[Tooltip("子弹的对象池")]private ObjectPool<GameObject> ammoPool;

这里我考虑使用对象池来管理子弹。
对象池目前仍然有很多问题,大家可以使用普通的方法处理。对象池中会出现的问题是弹道显示,这个问题我没有找到解决方法之前,我并不推荐大家使用对象池
那么在Start中建立对象池。在建立对象池前,要先为子弹设计一个类去做碰撞相关的事情。
在这里我们设计了一个事件作为碰撞的事件。然后在Gun中就可以添加相应的方法让子弹执行。

public UnityEvent destroyEvent = new UnityEvent();public bool isDestroy;private void OnEnable(){isDestroy = false;}private void OnTriggerEnter(Collider other){if (!other.CompareTag("Gun") && !isDestroy){isDestroy = true;destroyEvent?.Invoke();}}
     _inputMessage = FindObjectOfType<PlayerInputsMassage>();ammoPool = new ObjectPool<GameObject>(() =>{var ammo = Instantiate(_ammo, muzzle);ammo.AddComponent<AmmoBehavier>().destroyEvent.AddListener(() =>{ammoPool.Release(ammo);});return ammo;},(go) =>{go.SetActive(true);go.transform.position = muzzle.position;},(go) =>{go.SetActive(false);},(go) => { Destroy(go); });

接下来我们写一个Fire方法。
这里我们用对象池的get代替了平时的生成。生成则是交由对象池处理。

public void Fire(){Quaternion rotation = Quaternion.LookRotation(targetpoint.position - muzzle.position);GameObject ammo = ammoPool.Get();ammo.transform.rotation = rotation;ammo.GetComponent<Rigidbody>().velocity = ammo.transform.forward * _ammoSpeed;}

接下来我们设置一个非常好用的东西:EventHandler
可以认为这是一个专门处理事件的类,我们会将许多跨脚本的代码用它来写,会很方便调用。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public static class EventHandler
{public static event Action WeaponFire;public static void CallWeaponFire(){WeaponFire?.Invoke();}
}

这样开火的事件就写好了,我们只需要把每个代码需要处理与开火相关的内容写成一个方法,然后添加到这个事件中,然后由开火键触发这个方法即可。我们接下来简单演示一下(注意,这里我们的开火方法与触发都写在了Gun中,但以后涉及到枪械切换,就会将其分离)

private void OnEnable(){EventHandler.WeaponFire += Fire;//在该脚本启用时添加该方法}private void OnDisable(){EventHandler.WeaponFire -= Fire;//在该脚本停用时撤销该方法}

这样就做到了方法的注册,接下来是调用,该调用是可以放在任何地方,我只是希望将人物的移动与射击分离才这样写的。否则人物的控制脚本将会十分臃肿。

private void Update(){if(_inputMessage.fire&&_inputMessage.aim){EventHandler.CallWeaponFire();}}

这一章的内容暂时先到这里,由于有些问题仍然没有得到解决,这一章可能后续修改的可能性比较大。

【Unity】第三人称射击游戏开发过程之开火设计(TPS.S.P2)相关推荐

  1. 【Unity】第三人称射击游戏开发过程之瞄准状态设计(TPS.S.P1)

    [Unity]第三人称射击游戏开发过程之瞄准状态设计(TPS.S.P1) 设计整体的结构与模式 瞄准状态的设计 瞄准相机 瞄准状态 瞄准时的鼠标移动速度限制 瞄准点的处理 角色在瞄准状态下的旋转 瞄准 ...

  2. unity第三人称射击游戏_在游戏上第3部分完美的信息游戏

    unity第三人称射击游戏 Previous article 上一篇文章 The economics literature distinguishes the quality of a game's ...

  3. Unity 第三人称射击游戏视角控制与武器瞄准

    ===================更新一下源工程链接: 链接:https://pan.baidu.com/s/15bxH-MPregp2ZIN92fK7XA 提取码:e7bp ========== ...

  4. unity 第三人称射击游戏中如何防止跟随摄像机穿墙?

    在制作3d射击类游戏中,会遇到跟随角色的摄像机会穿透墙壁导致视野不佳情况,下面,介绍一下具体的解决方法. 我们需要用到的原理就是unity中射击线函数.具体的原理是,从相机的跟随点向相机的方向发射一条 ...

  5. Unity第三人称射击游戏的相机控制

    (关于其他几种角色移动的控制在我之前的博客有写到) 首先我们需要先理解一下第三人称相机控制的原理: 我们要实现的效果就是:获取鼠标的移动输入,转化成角色以及相机的旋转,通过鼠标输入Input.GetA ...

  6. Unity制作第三人称射击游戏-成为创新游戏开发者学习教程

    用Unity游戏引擎学习和制作第三人称射击游戏-成为创新游戏开发者- TPS战地克隆 你会学到什么 Unity 3D游戏开发 如何打造TPP第三人称射击游戏 第三人控制者 第三人称动画 第三人运动控制 ...

  7. 第三人称射击游戏-子弹方向问题

    1.出射点 在TPS第三人称射击游戏中,我们希望子弹从场景中的角色的枪口进行发射,而不是从摄像机或者玩家身体中,这样在视觉效果上,可以看到玩家的枪支开火 2.子弹飞行方向 相比于第一人称,第三人称就会 ...

  8. 视频教程-Unity3D实战入门之第三人称射击游戏(TPS)-Unity3D

    Unity3D实战入门之第三人称射击游戏(TPS) 6年程序开发经验,精通C/C++/C#编程. 曾担任过Unity3d游戏开发主程和Unity3d游戏开发讲师,熟悉Unity3d的UI系统.物理引擎 ...

  9. Unity3D实战入门之第三人称射击游戏(TPS)-伍晓波-专题视频课程

    Unity3D实战入门之第三人称射击游戏(TPS)-327人已学习 课程介绍         这是一套第三人称射击游戏开发的入门基础课程. 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建 ...

最新文章

  1. 如何访问MATLAB Builder for .NET Components
  2. Bluetooth ATT介绍
  3. 【Leetcode】岛屿问题(数量,周长,面积)
  4. 网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法
  5. mysql 1.42_MySQL索引(一)
  6. 好久没有来CSDN了,这段时间比较忙。。
  7. c语言语句的使用形式,C语言如何使用print语句
  8. ubuntu14.04 安装pip vitualenv flask
  9. 大数据商业智能的十大戒律
  10. 侯捷推荐的C++书单
  11. 判断请求是通过点击链接还是直接输入网址
  12. 计算机电路基础电压比较器电路图,计算机电路基础期末复习.doc
  13. 信号硬件入门--振幅调制信号发生器(正弦波发生器方案、AM调制方案)--First理论部分
  14. 初试锐捷交换机不同登录方式的密码设置
  15. PS下载Adobe Photoshop 2020中文安装教程 亲测可用
  16. 浏览器-Charset:Chrome浏览器升级后右键工具中的编码修改功能没有了的解决工具
  17. Java实现PC端支付宝网页支付
  18. 投影仪家用推荐最新?投影仪什么牌子性价比比较高
  19. 音频编码知识与技术参数,常用音频协议介绍
  20. nodejs+vue 智能餐厅菜品厨位分配管理系统

热门文章

  1. 如何英文版系统支持中文?
  2. APS中生产计划排程模块的基本原理
  3. 2019年Github开源项目最火TOP10,看看有没有你熟知的项目
  4. iPadOS 更新日志 - 持续更新中
  5. 人工智能头条技能树图谱汇集
  6. 每周一磁 · 铁氧体永磁材料
  7. Hadoop实例学习(九)Combiner合并
  8. Oracle数据库的逻辑结构
  9. 石大师装机大师一键重装Win11系统教程
  10. 安卓手机如何去掉广告方法