为什么我不能这样加分?

问题描述 投票:0回答:2

所以我一直在尝试制作一个小的生存原型,但我无法弄清楚这个项目需要的最基本的东西,捡东西。我写了下面的代码(我不是程序员)但它什么也没做,我就是不明白为什么。这是一个2D 4方向运动生存游戏。

整个代码我重写了很多次,尝试了所有我想到的方法。我只是不知道下一步该做什么。

此外,从调试看来,2 个碰撞器似乎没有发生碰撞?我不知道为什么。

玩家代码

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 OnTriggerRemain2D(Collider2D collision)
    {
        Debug.Log($"OnTriggerRemain2D. layer: {collision.gameObject.layer}\nSpacebar pressed: {Input.GetKeyDown(KeyCode.Space)}");
        if (collision.gameObject.CompareTag("Ker") && Input.GetKeyDown(KeyCode.Space))
        {
            logic.addStick();
            print("touching");
        }
        print("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();
        }
    }
c# unity3d
2个回答
0
投票

只需阅读代码,假设

OnTriggerEnter2D
被调用(您可以通过将打印移到 if 语句之外来检查),您将层与 3 进行比较, 永远不会是真的.

您可以使用

LayerMask.NameToLayer("Default")
代替。

如果你想知道为什么,那是因为Unity的图层使用了Flag系统。 所以 :

Layer1 = 0, Layer2 = 1, Layer3 = 2, Layer4 = 4, Layer5 = 8, etc.
对于 flags,3 表示 Layer2 和 Layer3,但 GameObject 一次只能有一层。

旁注:

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

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

0
投票

这可能最好用一个例子来回答。

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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.