当玩家与另一个物体碰撞并按下按键时,有没有办法加分?

Is there a way to add points when a player collides with another object and key pressed?

我正在制作一个 2D 节奏游戏,我想要它,所以当箭头与按钮碰撞并按下右键时,一个点将添加到我的分数系统中。现在无论箭头是否与按钮碰撞,只要按下键就会添加一个点。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Unity.VisualScripting;
using UnityEngine.UIElements;

public class NoteObject : MonoBehaviour
{

    public bool canBePressed;

    public KeyCode keyToPress;
    public ScoreManager scoreManager;

    private void Start()
    {

    }

    void Update()
    {
        if (Input.GetKeyDown(keyToPress))
        {
            if (canBePressed)
            {
                gameObject.SetActive(false);
            }
        }
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        GameObject tempObject = other.GameObject();
        if(tempObject.tag == "Activator")
        {
            Debug.Log("collided(:");
                canBePressed = true;
                ScoreManager.Instance.AddPoint();
        }
    }

    void OnTriggerExit2D(Collider2D other)
    {
        GameObject tempObject = other.GameObject();
        if (tempObject.tag == "Activator")
        {
            canBePressed = false;
        }
    }
} ```

关于“现在无论箭头是否与按钮碰撞,只要按下键就会添加一个点。”两点考虑:

1.- 根据代码,如果箭头与按钮发生碰撞,则无论是否在第一次碰撞中按下键 ,都会添加分数.因为分数加在OnTriggerEnter2D.

2.- 然后你在 UpdategameObject.SetActive(false); 所以 OnTriggerExit2D 不会发生并且 canBePressed 留给 true。 “注意:触发事件将发送到禁用的 MonoBehaviours,以允许启用行为以响应碰撞。”来自 documentation。因此,您将为每个按键禁用 gameObject,但不会根据显示的代码添加更多点,因为 ScoreManager.Instance.AddPoint();OnTriggerEnter2D 中,不会再发生。

所以请让我们知道代码行为的解释是否正确。

据我了解,您需要在满足两个条件时添加分数,
1.- 碰撞发生时 (canBePressed == true)
2. 按键被按下 (Input.GetKeyDown(keyToPress) == true) 所以 ScoreManager.Instance.AddPoint();Update

中更有意义

使用System.Collections.Generic; 使用统一引擎; 使用 UnityEngine.UI; 使用 Unity.VisualScripting; 使用 UnityEngine.UI 元素;

public class NoteObject : MonoBehaviour {

public bool canBePressed;

public KeyCode keyToPress;
public ScoreManager scoreManager;

private void Start()
{

}

void Update()
{
    if (Input.GetKeyDown(keyToPress))
    {
        if (canBePressed)
        {
            gameObject.SetActive(false);
            ScoreManager.Instance.AddPoint(); //put here
        }
    }
}

void OnTriggerEnter2D(Collider2D other)
{
    GameObject tempObject = other.GameObject();
    if(tempObject.tag == "Activator")
    {
        Debug.Log("collided(:");
            canBePressed = true;
            //ScoreManager.Instance.AddPoint(); //removed
    }
}

void OnTriggerExit2D(Collider2D other)
{
    GameObject tempObject = other.GameObject();
    if (tempObject.tag == "Activator")
    {
        canBePressed = false;
    }
}

}