所以我一直在尝试制作一个小的生存原型,但我无法弄清楚这个项目需要的最基本的东西,捡东西。我写了下面的代码(我不是程序员)但它什么也没做,我就是不明白为什么。这是一个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();
}
}
只需阅读代码,假设
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");
}
}
这可能最好用一个例子来回答。
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");
}
}