首页 > 其他分享 >Unity 2D平台跳跃游戏中冲刺和蓄力冲刺实现(新的输入系统)

Unity 2D平台跳跃游戏中冲刺和蓄力冲刺实现(新的输入系统)

时间:2024-11-08 21:47:06浏览次数:3  
标签:Dash void private 2D Unity 冲刺 public inputControl

使用新的输入系统去进行冲刺和蓄力冲刺的制作,我们要解决几个问题:

1.如何实现冲刺效果。

2.如何判断玩家是长按按键还是短按。

3.冲刺过程中如果撞到墙,应该怎么办?

4.冲刺时的镜头抖动应该怎么做?

我们一个一个来解决。

至于多向冲刺我个人认为可以单独开一篇来讲,主要介绍键盘和手柄去控制,以及手柄输入时的优化问题。

1.实现冲刺效果

新的输入系统在这里不做讲解,直接使用。

public class PlayerController : Singleton<PlayerController>
{
    public PlayerInputSystem inputControl;

    public float dashFroce;
    public float dashTime;
    public float dashCoolTime;

    public bool canDash;//冲刺的前置条件
    public bool isDashing;

    private void Awake()
    {
        canDash = true;
        isDashing = false;
        
        inputControl = new PlayerInputSystem();

        inputControl.GamePlay.Dash.started += Dash;
        inputControl.GamePlay.Dash.performed += EnergyStorageDash;
        inputControl.GamePlay.Dash.canceled += DisDash;
    }
    
    public void OnEnable()
    {
        inputControl.Enable();
    }

    public void OnDisable()
    {
        inputControl.Disable();
    }

    private void Dash(InputAction.CallbackContext obj)
    {
        if (canDash)
        {
            PrerequisiteDash();
            StartCoroutine(PlayerDash(dashTime,dashCoolTime));
        }  
    }

    private void PrerequisiteDash()
    {
        canDash = false;
        isDashing = true;
    }

    private IEnumerator PlayerDash(float dashTime,float dashCoolTime)
    {
        float originalGravity = rb.gravityScale;
        rb.gravityScale = 0f;
        rb.velocity = new Vector2(transform.localScale.x * dashFroce, 0);
        Debug.Log("冲刺开始");
        
        yield return new WaitForSeconds(dashTime);
        rb.velocity = new Vector2(0, 0);
        rb.gravityScale = originalGravity;
        isDashing = false;
        Debug.Log("冲刺结束");
        
        yield return new WaitForSeconds(dashCoolTime);
        canDash = true;
    }
}

冲刺主要通过协程来实现,两个bool分别用来判断是否可以冲刺和是否在冲刺过程中,这样具有很好的拓展性,可以在冲刺基础上实现更多想法,例如蓄力冲刺,多向冲刺等。

2.如何判断长按按键还是短按

这里说一种非常容易理解的方式,刚才的冲刺是按下一瞬间执行,而我现在使用另一种方法:如果玩家按按键超过一定时间我就执行蓄力冲刺,如果没有就执行冲刺,而具体执行的方法我放在松开按键的时候去执行。

1.如何设置超过多少时间去触发蓄力冲刺呢?

 绿色框可以添加事件,我选择Hold,然后会出现默认参数,取消勾选蓝色方框中的Default,就可以自定义时间去触发了持续按住按键的事件了。 

2.书写脚本逻辑

    private void EnergyStorageDash(InputAction.CallbackContext obj)
    {
        if (playerCheck.isGround)
        {
            isEnergyStorageDash = true;
            inputControl.GamePlay.Move.Disable();
            Debug.Log("蓄力冲刺");
        }
    }

    private void DisDash(InputAction.CallbackContext obj)
    {
        if (!isEnergyStorageDash)
        {
            PrerequisiteDash();
            StartCoroutine(PlayerDash(dashTime,dashCoolTime));
        }else
        {
            PrerequisiteDash();
            StartCoroutine(PlayerDash(energyStorageDashTime, energyStorageDashCoolTime));
        }
        
    }

3.冲刺过程中撞到墙之后如何停下来

我们需要单独写一个物理检测的脚本挂载人物身上,当检测到墙壁时并且在移动过程中,我们就让刚体的速度等于零即可

4.冲刺时的镜头抖动

使用Cinemachine官方插件,创建一个空物体,添加Cinemachine Impulse Sourece的组件(脚本),这相当于一个振动源,再给摄像机挂一个脚本,用来监听震动事件,一旦玩家冲刺便广播这个冲刺事件,然后摄像机执行震动。

1.人物脚本去广播事件:

    public UnityEvent OnTakeDash;//添加广播事件

    OnTakeDash?.Invoke();//执行广播事件

 2.事件中心

using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(menuName = "Event/VoidEventSO")]

public class VoidEventSO : ScriptableObject
{
    public UnityAction OnEventRaised;

    public void RaiseEvent()
    {
        OnEventRaised?.Invoke();
    }
}

这个是写成了SO文件的形式,也可以用代码写一个,只不过这样更加可视化。

3.摄像机监听事件并执行震动方法

public class CameraControl : MonoBehaviour
{
    [Header("震动源")]
    public CinemachineImpulseSource impulseSource_Dash;

    [Header("事件监听")]
    public VoidEventSO cameraShakeEvent;

    private void OnEnable()
    {
        cameraShakeEvent.OnEventRaised += OnCameraShakeEvent;
    }

    private void OnDisable()
    {
        cameraShakeEvent.OnEventRaised -= OnCameraShakeEvent;
    }


    private void OnCameraShakeEvent()
    {
        Debug.Log("相机震动");
        impulseSource_Dash.GenerateImpulse();
    }
}

在我的理解中,事件中心相当于一个中继站,一边接收广播,一边去给监听发指令。

最后,文中代码部分需要自己再完善一下,只是介绍一种解决思路,如果有更好的方法也可以仙人指路或者评论区分享。

标签:Dash,void,private,2D,Unity,冲刺,public,inputControl
From: https://blog.csdn.net/stariser/article/details/143634825

相关文章

  • P8906 [USACO22DEC] Breakdown P [最短路]
    P8906[USACO22DEC]BreakdownPSolution经典trick,删边比较难处理,转换成加边,倒着处理。那我们接下来要考虑,怎么记录状态,以及,每加一次边要如何更新状态。还是比较套路地,我们可以求出\(1\)到某个点\(i\)经过\(k/2\)条边的最短路,再求出\(i\)到\(n\)经过\(k-k/2......
  • 【Unity插件】STP (Survival Template PRO) 快速构建生存类游戏的核心功能
    STP(SurvivalTemplatePRO)是一款专为开发生存类游戏而设计的Unity插件,旨在提供一个基础框架,帮助开发者快速构建生存类游戏的核心功能。它包含了一些预制功能和模块,使开发者能够集中精力于游戏的内容和玩法,而不必从零开始编写复杂的生存系统。主要特点:玩家生命系统:生......
  • 【Unity生存游戏开发插件】STP Survival Template PRO(STP)快速搭建生存游戏的核心机制
    STPSurvivalTemplatePRO(STP)是Unity平台上专为生存类游戏开发的模板插件。它帮助开发者快速搭建生存游戏的核心机制,包含许多生存类游戏常见的功能模块,从而让开发者能集中精力于内容创作而非重复的基础架构搭建。以下是STPSurvivalTemplatePRO的主要功能和特点:1. 核心生......
  • 第1篇Scrum冲刺博客
    软件工程班级链接作业要求作业要求作业目标项目冲刺团队成员姓名学号王睿娴3222003968张颢严3222004426梁恬(组长)3222004467潘思言3222004423一、各个成员在Alpha阶段认领的任务二、明日各个成员的任务安排三、整个项目预期......
  • [赛记] 多校A层冲刺NOIP2024模拟赛19
    图书管理85pts2s1e10助我85pts;考虑正解,仍然是算贡献;这个题有一个很通用的套路:将大于某数的数看成$1$,小于这个数的数看成$0$;那么我们枚举$a_i$,运用上面的套路将$i$左边的前缀和算出来并开个桶记录一下端点编号之和,然后在枚举$i$右边的同时找到现在的前缀和......
  • NOIP2024 前集训:多校A层冲刺NOIP2024模拟赛19
    前言这次不是之前学长吃完吐出来的shi,这次是新拉的热乎的烫嘴的shi。T1、2、3、4大样例全部错一遍,T1题面和时限再错一遍哈哈哈。T4假做法有60哈哈哈,大样例跑出来半个对的都没有能得60哈哈哈。accodersT1前半小时没数据做得快的全部都死哈哈(还好我第一份被卡常了后......
  • .NET IoC 容器(二)Unity
    .NETIoC容器(二)Unity1UnityUnityApplicationBlock(Unity)是Microsoft模式和实践团队(Patterns&Practicesteam)推出的一个开源依赖注入容器。它是.NETFramework的一个组件,旨在简化应用程序的构建过程,提高代码的可测试性和可维护性。UnityApplicationBlock提供了以下功能:......
  • CommunityToolkit.Mvvm框架
    .NETWPFCommunityToolkit.Mvvm框架1源生成器1.1ObservablePropertyAttribute&RelayCommandAttributeusingCommunityToolkit.Mvvm.ComponentModel;usingCommunityToolkit.Mvvm.Input;usingSystem.Windows;namespaceTestCommunityToolkit._1_Attribute{pub......
  • [赛记] NOIP2024加赛1 && 多校A层冲刺NOIP2024模拟赛18
    暴力错解大赛玩游戏82pts乱糊的错解,正确性和时间复杂度都不对,但是拿了82pts;对于正解,考虑从$k$将原序列分成两个部分,左边和右边,然后分别求一次前缀和(注意这里,可以省去很多分讨和常数),设前一个前缀和数组为$a$,后一个为$b$,那么问题就转化成有两个指针$i,j$,可以任......
  • 多校A层冲刺NOIP2024模拟赛19
    多校A层冲刺NOIP2024模拟赛19其实不太想写博客,但还是从今天开始坚持写吧。T1图书管理对于这种一边大一边小的问题,一般套路是大的设为$1$,小的设为$-1$,这道题也是,这样之后去扫一遍,两端的前缀和值一样即可。T2两棵树新学到的一个重要$trick$是:$$连通块的个数......