【问题标题】:Unity2D OnCollisionEnter2DUnity2D OnCollisionEnter2D
【发布时间】:2015-08-01 03:38:37
【问题描述】:

您好,我正在创建一个 2d 游戏并实现了一个对话脚本 - 当一个游戏对象与另一个游戏对象发生碰撞并且按下键盘上的特定键时,会出现一个文本框。

对话框(文本框)使用 OnGUI 出现,后面有一个数组方法。这成功了。一旦对话完成数组重置,但是我会认为一切都是真实的,即碰撞和按下键盘上的键,对话会再次出现..它没有。

让对话再次出现的唯一方法是,如果我的游戏对象远离另一个游戏对象的碰撞器,然后再次与它碰撞。无论如何,我是否不必离开对撞机,然后必须重新启动与碰撞的接触才能显示我的对话?如果所有论点都是真的,我不明白为什么我必须这样做?

抱歉,如果我描述的问题很糟糕,我希望有人能提供帮助。这可能是 OnCollision2d 工作的唯一方式。我不知道。

这是我使用 C# 的代码(我不确定特定部分是否足够重要,所以我将全部发布):

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);
    }


    }
    }

谢谢。

【问题讨论】:

    标签: c# unity3d collision


    【解决方案1】:

    OnCollisionEnter 仅在发生碰撞时触发一次。如果您希望它在物体接触时不断触发,您需要使用不同的检查,例如OnCollisionStay

    来自评论

    当两个对象接触时,值index 永远不会被重置。检查您想要的索引值(当使用dialogue 的最后一项时),当匹配时,将其重置为0。这样,对话可以立即重新开始。

    【讨论】:

    • 是的,我已经尝试过了,但我仍然必须将对象从碰撞中移开,然后才能再次重新启动对话:(
    • 您能否更具体地了解正在发生的事情?我对这一系列事件有点困惑。
    • 是的,对不起。我的场景中有两个游戏对象(玩家控制的一个人和 NPC(在脚本中命名为 collisionwithhouse))。当它们发生碰撞并且我按下“r”键时,会出现一个对话框。玩家一直按“r”键来运行对话。一旦对话完成(数组),它就会重置。如果玩家想让对话再次出现,我希望他们只需按 r 键,但由于某种原因,他们必须离开 NPC 的对撞机框,然后重新进入(然后按 r 键)才能再次出现对话新重置数组。
    • 您确定阵列被正确清除了吗?看起来System.Array.Clear(dialogue,0, index = 0); 将数组作为第二个参数,将长度作为第三个参数。如果将其更改为 System.Array.Clear(dialogue,0, 1); 会发生什么?
    • 当使用 System.Array.Clear(dialogue,0, 1);数组似乎没有重置,我只能运行一次对话。如果我在编码方面做得更好,我可以更雄辩地详细说明我希望实现的目标,抱歉。 :(感谢您的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多