【问题标题】:Is there a way to add points when a player collides with another object and key pressed?当玩家与另一个物体碰撞并按下按键时,有没有办法添加积分?
【发布时间】:2022-01-20 00:38:33
【问题描述】:

我正在制作一个 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;
        }
    }
} ```

【问题讨论】:

  • other.GameObject(); 这根本不应该编译...你的意思是other.gameObject ...?
  • Right now a point is added just when the key pressed no matter if the arrow has collided with the button. ...在我看来,现在似乎为碰撞添加了一个点,根本没有任何按键...因为这就是您调用ScoreManager.Instance.AddPoint();的方式。 ..

标签: c# visual-studio unity3d game-engine


【解决方案1】:

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

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

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

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

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

使用 System.Collections.Generic; 使用 UnityEngine; 使用 UnityEngine.UI; 使用 Unity.VisualScripting; 使用 UnityEngine.UIElements;

公共类 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;
    }
}

}

【讨论】:

  • 谢谢!这解决了我的问题,感谢您也解释它,这有助于我理解为什么我的代码不起作用以及您的解决方案为什么起作用!
  • 很高兴有帮助:)
猜你喜欢
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多