• Unity开发一个FPS游戏


    在之前的文章Unity 3D Input System的使用-CSDN博客中,我介绍了如何用Input System来实现一个FPS游戏的移动控制,这里将进一步完善这个游戏。

    以下是游戏的演示效果:

    fps_demo

    添加武器模型

    首先是增加主角玩家的武器,我们可以在网上搜索到很多免费的3D资源,例如在以下网址可以下载到一个很不错的3D模型,里面包括了相关的动画。Animated Assault Rifle - Download Free 3D model by JUST (@teenjust500) [46a12c6] (sketchfab.com)

    点击下载为FBX格式,并保存到本地。然后打开我们之前的Unity项目,新建一个models文件夹,把下载的3D模型的FBX文件以及相应的材质文件都放到这个目录下。 把这个模型拖动到Player的PlayerCameraRoot下,可以设置模型的scale以调整适合我们的场景。这里我设置的缩放比例是0.08。然后调整一下这个模型的位置,使得能在摄像机里面恰当的显示。点击Play按钮可以看看效果。

    这个模型包括了一些动画场景,其中的Idle,Shoot和Reload是FPS中需要用到的。点击展开models里面的HandWithGloves模型,把其中的一个动画,例如Armature|Reload拖动到刚才创建的Game Object,这样就会自动创建Animator,把idle, reload和shoot这三个动画拖动到Animator,然后创建transition,如下图:

    在Animator的Parameters里面,新增两个Trigger类型的参数,分别为Reload和Shoot,再增加一个IsReload的Bool类型参数。然后点击从Any State切换到Reload State的线段,在Condition里面选择Reload。点击从Any State切换到Shoot State的线段,在Condition里面选择Shoot以及IsReload为false。

    点击Reload这个State,然后添加一个Behavior Script,命名为ReloadControl,其代码如下:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class ReloadControl : StateMachineBehaviour
    5. {
    6. // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    7. override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    8. {
    9. animator.SetBool("IsReload", true);
    10. }
    11. // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    12. //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    13. //{
    14. //
    15. //}
    16. // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    17. override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    18. {
    19. animator.SetBool("IsReload", false);
    20. }
    21. // OnStateMove is called right after Animator.OnAnimatorMove()
    22. //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    23. //{
    24. // // Implement code that processes and affects root motion
    25. //}
    26. // OnStateIK is called right after Animator.OnAnimatorIK()
    27. //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    28. //{
    29. // // Implement code that sets up animation IK (inverse kinematics)
    30. //}
    31. }

    增加Input Action

    在项目的Assets->Input目录下,点击之前创建的PlayerInputAsset,增加一个Reload Action,Type是Button,然后添加一个Binding绑定到键盘的R键。增加一个Shoot Action,Type也是Button,Interactions里面增加一个Press,Trigger Behavior设置为Press Only,然后绑定到鼠标的左键。增加一个Shoot Release Action,Type也是Button,Interactions里面增加一个Press,Trigger Behavior设置为Release Only,也是绑定到鼠标的左键。

    打开PlayerInputAsset这个脚本文件,在里面增加以下代码:

    1. public bool reload;
    2. public bool shoot;
    3. public long shootPressTS = 0;
    4. public bool firstShoot;
    5. public void OnShoot(InputValue value) {
    6. shoot = true;
    7. if (shootPressTS==0) {
    8. firstShoot = true;
    9. } else {
    10. firstShoot = false;
    11. }
    12. shootPressTS = DateTime.UtcNow.Ticks;
    13. }
    14. public void OnShootRelease(InputValue value) {
    15. shoot = false;
    16. shootPressTS = 0;
    17. }
    18. public void OnReload(InputVa
  • 相关阅读:
    spring复习:(61)自定义CustomAutowireConfigurer
    1、深入了解MySQL中内部组件架构(连接器,查询缓存,分析器,优化器,执行器等)
    Windows安装ElasticSearch
    Golang中gRPC使用及原理探究
    kali2024上Volatility的安装(无报错)
    Go语言error错误处理
    Linux操作系统 - 进程
    没有学过C语言可以学Java吗?
    Apache Doris 2.0.1 & 1.2.7 版本正式发布!
    技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别
  • 原文地址:https://blog.csdn.net/gzroy/article/details/136214759