unity OnTriggerStay2D() 用于两个触发器
unity OnTriggerStay2D() for two triggers
我正在使用 unity 5 c#,我有一个带有 2 个触发碰撞器的游戏对象,其中一个位于不同的位置。
我需要能够为它们使用 OnTriggerStay2D 和 OnTriggerEnter2D,但我需要找到正在输入的触发器。现在,如果我输入第一个(多边形)触发器,则 OnTriggerEnter 会为第二个(框)激活。
我怎样才能区分这两个对撞机???
public void OnTriggerEnter2D(Collider2D other) //2nd collider trigger
{
if (other.tag == "Player") {
Found = true; //if the player is in shooting range
Idle = false;
}
}
public void OnTriggerStay2D(Collider2D other) //1st collider trigger
{
if (Found != true) {
if (other.tag == "Player") {
Shield = true;
Idle = false;
}
}
}
public void OnTriggerExit2D(Collider2D other) //2nd collider trigger
{
if (other.tag == "Player") {
Found = false;
Shield = false;
Shooting = false;
Idle = true;
}
}
我已经尝试制作第一个触发器 public void OnTriggerStay2D(PolygonCollider2D other) 但它说“此消息参数必须是类型:Collider2D
该消息将被忽略。"
我想做的是在游戏对象前面有一个多边形触发器,并且在靠近游戏对象的地方有一个不同的方框触发器,所以当你靠近游戏对象时,你会进入第一个触发器,它会竖起它的盾牌但是当你靠近它(在它的射程内)它会放下盾牌开始射击你。
collider2d 可以检测所有类型的二维碰撞体。它是多边形还是只是一个盒子并不重要。作为文档建议,它不需要是 public 或私有的。然而,它只需要一个 collider2d 作为参数。
出于调试目的,为什么不使用打印?
Print("you've entered the trigger function");
此外,我不会在同一个游戏对象上使用 2 个不同的触发碰撞器。为什么不只制作 2 个单独的游戏对象,这样您就可以进行更彻底的检测。每个具有自己的触发碰撞器的游戏对象都可以有不同的标签。
如果你必须在一个物体上使用 2 个触发碰撞器。这不是最好的主意。您可以使用 shapeCount 来确定它击中了哪个。尽管就像我说的那样,当您尝试在两个单独的对象上更容易时,我会保证不要在同一个对象上执行 2 个触发碰撞器。
但是我认为通常不会禁止链接。我会观看和研究这些视频。它们对于解释引擎非常有用,而且它们实际上并没有那么长。
https://unity3d.com/learn/tutorials/modules/beginner/2d
他们甚至有一个解释 2d 对撞机的视频。
这是我的解决方法。在我的一个游戏中,我有一块巨石,我有一个触发器,它会删除它下面的一个方块,所以它会掉落,然后我有另一个触发器告诉巨石开始向左或向右移动,然后我还有另一个触发器会删除一旦巨石接触到巨石。
所以你可以做的是创建 2 个新的游戏对象,创建一个新的 CS 文件并适当地命名它们,然后用这两个新的 classes 允许它们接收你在你的问题。
然后当它们被触发时,您可以使用它们 class 中的代码。
所以你的第一个 class 会变成这样
public void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player") {
Enemy.Found = true; //if the player is in shooting range
Enemy.Idle = false;
}
}
public void OnTriggerExit2D(Collider2D other)
{
if (other.tag == "Player") {
Enemy.Exit2DTrigger();
}
}
那么另一个class就是这样
public void OnTriggerStay2D(Collider2D other)
{
if (Enemy.Found != true) {
if (other.tag == "Player") {
Enemy.Shield = true;
IEnemy.dle = false;
}
}
}
public void OnTriggerExit2D(Collider2D other)
{
if (other.tag == "Player") {
Enemy.Exit2DTrigger();
}
}
那么在你的 Enemy class 你会
public void Exit2DTrigger()
{
Found = false;
Shield = false;
Shooting = false;
Idle = true;
}
P.S。你也不需要使用 other.gameObject.tag == "Player" ?
我正在使用 unity 5 c#,我有一个带有 2 个触发碰撞器的游戏对象,其中一个位于不同的位置。 我需要能够为它们使用 OnTriggerStay2D 和 OnTriggerEnter2D,但我需要找到正在输入的触发器。现在,如果我输入第一个(多边形)触发器,则 OnTriggerEnter 会为第二个(框)激活。 我怎样才能区分这两个对撞机???
public void OnTriggerEnter2D(Collider2D other) //2nd collider trigger
{
if (other.tag == "Player") {
Found = true; //if the player is in shooting range
Idle = false;
}
}
public void OnTriggerStay2D(Collider2D other) //1st collider trigger
{
if (Found != true) {
if (other.tag == "Player") {
Shield = true;
Idle = false;
}
}
}
public void OnTriggerExit2D(Collider2D other) //2nd collider trigger
{
if (other.tag == "Player") {
Found = false;
Shield = false;
Shooting = false;
Idle = true;
}
}
我已经尝试制作第一个触发器 public void OnTriggerStay2D(PolygonCollider2D other) 但它说“此消息参数必须是类型:Collider2D 该消息将被忽略。"
我想做的是在游戏对象前面有一个多边形触发器,并且在靠近游戏对象的地方有一个不同的方框触发器,所以当你靠近游戏对象时,你会进入第一个触发器,它会竖起它的盾牌但是当你靠近它(在它的射程内)它会放下盾牌开始射击你。
collider2d 可以检测所有类型的二维碰撞体。它是多边形还是只是一个盒子并不重要。作为文档建议,它不需要是 public 或私有的。然而,它只需要一个 collider2d 作为参数。
出于调试目的,为什么不使用打印?
Print("you've entered the trigger function");
此外,我不会在同一个游戏对象上使用 2 个不同的触发碰撞器。为什么不只制作 2 个单独的游戏对象,这样您就可以进行更彻底的检测。每个具有自己的触发碰撞器的游戏对象都可以有不同的标签。
如果你必须在一个物体上使用 2 个触发碰撞器。这不是最好的主意。您可以使用 shapeCount 来确定它击中了哪个。尽管就像我说的那样,当您尝试在两个单独的对象上更容易时,我会保证不要在同一个对象上执行 2 个触发碰撞器。
但是我认为通常不会禁止链接。我会观看和研究这些视频。它们对于解释引擎非常有用,而且它们实际上并没有那么长。 https://unity3d.com/learn/tutorials/modules/beginner/2d 他们甚至有一个解释 2d 对撞机的视频。
这是我的解决方法。在我的一个游戏中,我有一块巨石,我有一个触发器,它会删除它下面的一个方块,所以它会掉落,然后我有另一个触发器告诉巨石开始向左或向右移动,然后我还有另一个触发器会删除一旦巨石接触到巨石。
所以你可以做的是创建 2 个新的游戏对象,创建一个新的 CS 文件并适当地命名它们,然后用这两个新的 classes 允许它们接收你在你的问题。
然后当它们被触发时,您可以使用它们 class 中的代码。
所以你的第一个 class 会变成这样
public void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player") {
Enemy.Found = true; //if the player is in shooting range
Enemy.Idle = false;
}
}
public void OnTriggerExit2D(Collider2D other)
{
if (other.tag == "Player") {
Enemy.Exit2DTrigger();
}
}
那么另一个class就是这样
public void OnTriggerStay2D(Collider2D other)
{
if (Enemy.Found != true) {
if (other.tag == "Player") {
Enemy.Shield = true;
IEnemy.dle = false;
}
}
}
public void OnTriggerExit2D(Collider2D other)
{
if (other.tag == "Player") {
Enemy.Exit2DTrigger();
}
}
那么在你的 Enemy class 你会
public void Exit2DTrigger()
{
Found = false;
Shield = false;
Shooting = false;
Idle = true;
}
P.S。你也不需要使用 other.gameObject.tag == "Player" ?