所以我一直在尝试做一个小的生存原型,但我不能弄清楚这个项目所需要的最基本的东西,捡东西。我写了下面的代码(我不是程序员),但它什么也没做,我就是不明白为什么。这是一个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();
}
}
2条答案
按热度按时间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一次只能有一层。旁注:
在您的情况下,使用标签比使用图层更好。它看起来像这样 (用您的标签替换“播放器”):
jogvjijk2#
最好用一个例子来回答这个问题。
你可能会开始注意到的问题是,
OnTriggerEnter2D
事件只发生一次,持续几分之一秒,当你将其与Input.GetKeyDown
结合使用时,它也发生在一帧中,持续几分之一秒,世界上几乎没有机会这两个事件同时为真。我认为你应该使用(a)
OnTriggerRemain2D
,或者使用(B)Input.GetKey
。如果你正在检查对象是否在触发器中“剩余”,你有足够的时间按空格键。或者,如果你使用GetKey,你可以在进入触发器之前按空格键,你的条件将得到满足。概括地说,(a)
或(B)