unity3d 为什么我不能这样加分数?

v1l68za4  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(219)

所以我一直在尝试做一个小的生存原型,但我不能弄清楚这个项目所需要的最基本的东西,捡东西。我写了下面的代码(我不是程序员),但它什么也没做,我就是不明白为什么。这是一个2D 4定向运动生存游戏。
我已经重写了整个代码很多次,尝试了所有我想到的方法。我只是不知道下一步该怎么做。
另外,从调试看,两个碰撞器似乎没有发生碰撞?我不知道为什么。
所以,在回答中,有人说“嘿,使用OnTriggerRemain 2D!”我做了...后来有人在这篇文章下的评论中向我指出,这个功能不存在。请帮助,我开始绝望了。
所以,progress,debug显示它们发生了冲突,它们知道这一点,但它们似乎没有将点添加到我创建的文本中,我认为它没有记录键盘按下,但我正在接近。
它几乎工作,它只增加了移动时,并在大量,但它的工作,我很高兴它.

播放器编码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HracMovement : MonoBehaviour
{
    public float playerSpeed = 1000f;
    private Rigidbody2D rb;
    private Vector2 movementDirection;
    public LogicManager logic;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        logic = GameObject.FindGameObjectWithTag("Logic").GetComponent<LogicManager>();
    }

    void Update()
    {
        movementDirection = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
    }

    void FixedUpdate()
    {
        rb.velocity = movementDirection * playerSpeed;
    }
        void OnTriggerStay2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Ker") && Input.GetKeyDown(KeyCode.Space))
        {
            logic.addStick();
            Debug.Log("touching");
        }
    }

}

逻辑管理器代码

using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class LogicManager : MonoBehaviour
    {
        public int score = 0;
        public Text scoreText;
    
        void Start()
        {
            
        }
    
        public void addStick()
        {
            score = score + 1;
            scoreText.text = score.ToString();
        }
    }
k4aesqcs

k4aesqcs1#

通过阅读代码,假设调用了OnTriggerEnter2D(您可以通过将print移动到if语句之外来检查),您将层与3进行比较,这永远不会为真
您可以使用LayerMask.NameToLayer("Default")
如果你想知道为什么,那是因为Unity的层使用了Flag system。所以:Layer1 = 0, Layer2 = 1, Layer3 = 2, Layer4 = 4, Layer5 = 8, etc.如果有flags,3表示Layer2 AND Layer3,但GameObject一次只能有一层。

旁注:

在您的情况下,使用标签比使用图层更好。它看起来像这样 (用您的标签替换“播放器”)

void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.CompareTag("Player") && Input.GetKeyDown(KeyCode.Space))
    {
        logic.addStick();
        print("touching");
    }
}
jogvjijk

jogvjijk2#

最好用一个例子来回答这个问题。

void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log($"OnTriggerEnter2D. layer: {collision.gameObject.layer}\nSpacebar pressed: {Input.GetKeyDown(KeyCode.Space)}");
    if (collision.gameObject.layer == 3 && Input.GetKeyDown(KeyCode.Space))
    {
        logic.addStick();
        Debug.Log("touching");
    }
}

你可能会开始注意到的问题是,OnTriggerEnter2D事件只发生一次,持续几分之一秒,当你将其与Input.GetKeyDown结合使用时,它也发生在一帧中,持续几分之一秒,世界上几乎没有机会这两个事件同时为真。
我认为你应该使用(a)OnTriggerRemain2D,或者使用(B)Input.GetKey。如果你正在检查对象是否在触发器中“剩余”,你有足够的时间按空格键。或者,如果你使用GetKey,你可以在进入触发器之前按空格键,你的条件将得到满足。
概括地说,(a)

void OnTriggerRemain2D(Collider2D collision)
{
    Debug.Log($"OnTriggerRemain2D. layer: {collision.gameObject.layer}\nSpacebar pressed: {Input.GetKeyDown(KeyCode.Space)}");
    if (collision.gameObject.layer == 3 && Input.GetKeyDown(KeyCode.Space))
    {
        logic.addStick();
        Debug.Log("touching");
    }
}

或(B)

void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log($"OnTriggerEnter2D. layer: {collision.gameObject.layer}\nSpacebar pressed: {Input.GetKey(KeyCode.Space)}");
    if (collision.gameObject.layer == 3 && Input.GetKey(KeyCode.Space))
    {
        logic.addStick();
        Debug.Log("touching");
    }
}

相关问题