Unity2D OnCollisionEnter2D
Unity2D OnCollisionEnter2D
你好,我正在创建一个 2d 游戏并实现了一个对话脚本 - 当一个游戏对象与另一个游戏对象发生碰撞并且按下键盘上的特定键时,会出现一个文本框。
对话框(文本框)使用 OnGUI 出现,后面有一个数组方法。这成功了。一旦对话完成,阵列就会重置,但是我会认为一切都已经是真的,即碰撞和按下键盘上的键,对话会再次出现......它不会。
让对话再次出现的唯一方法是,如果我的游戏对象远离另一个游戏对象的碰撞器,然后再次与其碰撞。无论如何,我是否不必离开对撞机然后必须重新开始与碰撞的接触才能显示我的对话?我不明白如果所有参数都为真,为什么我必须这样做?
抱歉,如果我对问题的描述不当,我希望有人能提供帮助。这可能是 OnCollision2d 工作的唯一方式。我不知道。
这是我使用 C# 编写的代码(我不确定特定部分是否足够丰富,所以我 post 全部):
using UnityEngine;
using System.Collections;
public class showtext : MonoBehaviour
{
bool CollisionWithHouse = false;
bool ActionButtonTextAppearsWithCollision = false;
public string[] dialogue = {"Greetings?",
"Farewell, my friend."};
int index = 0;
Rect dialogueRect = new Rect(435,100,500,50);
Rect dialogueRect2 = new Rect(335,50,300,34);
void Update() {
if (CollisionWithHouse && (ActionButtonTextAppearsWithCollision && Input.GetKeyDown("r")))
{
index++;
}
if (CollisionWithHouse && Input.GetKeyDown("r")){
ActionButtonTextAppearsWithCollision = true;
}
}
void OnCollisionEnter2D(Collision2D house){
{
CollisionWithHouse = true;
}
}
void OnCollisionExit2D(Collision2D house){
CollisionWithHouse = false;
ActionButtonTextAppearsWithCollision = false;
}
void OnGUI() {
if (index < 1 && (CollisionWithHouse) && (ActionButtonTextAppearsWithCollision)) {
GUI.Box(dialogueRect, dialogue[index]);
}
if (index > 0 && (CollisionWithHouse) && (ActionButtonTextAppearsWithCollision)) {
GUI.Box (dialogueRect2, dialogue [index]);
}
else {
System.Array.Clear(dialogue,0, index = 0);
}
}
}
谢谢。
OnCollisionEnter 仅在碰撞发生时触发一次。如果你想让它在物体接触时不断发射,你需要使用不同的检查,比如 OnCollisionStay.
来自评论
当两个对象接触时,值 index
永远不会被重置。检查你想要的索引值(当使用dialogue
的最后一项时),当它匹配时,将其重置为0。这样,对话可以立即重新开始。
你好,我正在创建一个 2d 游戏并实现了一个对话脚本 - 当一个游戏对象与另一个游戏对象发生碰撞并且按下键盘上的特定键时,会出现一个文本框。
对话框(文本框)使用 OnGUI 出现,后面有一个数组方法。这成功了。一旦对话完成,阵列就会重置,但是我会认为一切都已经是真的,即碰撞和按下键盘上的键,对话会再次出现......它不会。
让对话再次出现的唯一方法是,如果我的游戏对象远离另一个游戏对象的碰撞器,然后再次与其碰撞。无论如何,我是否不必离开对撞机然后必须重新开始与碰撞的接触才能显示我的对话?我不明白如果所有参数都为真,为什么我必须这样做?
抱歉,如果我对问题的描述不当,我希望有人能提供帮助。这可能是 OnCollision2d 工作的唯一方式。我不知道。
这是我使用 C# 编写的代码(我不确定特定部分是否足够丰富,所以我 post 全部):
using UnityEngine;
using System.Collections;
public class showtext : MonoBehaviour
{
bool CollisionWithHouse = false;
bool ActionButtonTextAppearsWithCollision = false;
public string[] dialogue = {"Greetings?",
"Farewell, my friend."};
int index = 0;
Rect dialogueRect = new Rect(435,100,500,50);
Rect dialogueRect2 = new Rect(335,50,300,34);
void Update() {
if (CollisionWithHouse && (ActionButtonTextAppearsWithCollision && Input.GetKeyDown("r")))
{
index++;
}
if (CollisionWithHouse && Input.GetKeyDown("r")){
ActionButtonTextAppearsWithCollision = true;
}
}
void OnCollisionEnter2D(Collision2D house){
{
CollisionWithHouse = true;
}
}
void OnCollisionExit2D(Collision2D house){
CollisionWithHouse = false;
ActionButtonTextAppearsWithCollision = false;
}
void OnGUI() {
if (index < 1 && (CollisionWithHouse) && (ActionButtonTextAppearsWithCollision)) {
GUI.Box(dialogueRect, dialogue[index]);
}
if (index > 0 && (CollisionWithHouse) && (ActionButtonTextAppearsWithCollision)) {
GUI.Box (dialogueRect2, dialogue [index]);
}
else {
System.Array.Clear(dialogue,0, index = 0);
}
}
}
谢谢。
OnCollisionEnter 仅在碰撞发生时触发一次。如果你想让它在物体接触时不断发射,你需要使用不同的检查,比如 OnCollisionStay.
来自评论
当两个对象接触时,值 index
永远不会被重置。检查你想要的索引值(当使用dialogue
的最后一项时),当它匹配时,将其重置为0。这样,对话可以立即重新开始。