Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道玩家角色是否已使用碰撞器进入触发器或其他对象?_C#_Unity3d - Fatal编程技术网

C# 如何知道玩家角色是否已使用碰撞器进入触发器或其他对象?

C# 如何知道玩家角色是否已使用碰撞器进入触发器或其他对象?,c#,unity3d,C#,Unity3d,我正在制作一个3D游戏,场景中有一些水。我给它装了一个触发对撞机。当玩家角色的对撞机进入水的触发对撞机时,将播放飞溅声。当角色离开水面时也会发生同样的情况 现在我已经添加了另一个玩家游戏对象的碰撞器子对象。正如我所预料的,现在当玩家进入水中时,两个不同的对撞机击中了扳机,所以它产生了两种声音。我想做的是检查激活触发器的对撞机是否真的是播放器,这样它只能播放一次声音,就像以前一样,也应该这样 这就是我试图做的 使用系统集合; 使用System.Collections.Generic; 使用Unit

我正在制作一个3D游戏,场景中有一些水。我给它装了一个触发对撞机。当玩家角色的对撞机进入水的触发对撞机时,将播放飞溅声。当角色离开水面时也会发生同样的情况

现在我已经添加了另一个玩家游戏对象的碰撞器子对象。正如我所预料的,现在当玩家进入水中时,两个不同的对撞机击中了扳机,所以它产生了两种声音。我想做的是检查激活触发器的对撞机是否真的是播放器,这样它只能播放一次声音,就像以前一样,也应该这样

这就是我试图做的

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共课泼水:单一行为
{
公共音频源;
公共音频剪辑泼水;
私有布尔值isInTheWater=false;
公共游戏对象玩家;
专用无效OnTiggerCenter(冲突)
{
if(collision.gameObject==玩家)
{
音频源:PlayOneShot(splashInWater);
}
}
私有无效OnTriggerExit(冲突)
{
if(collision.gameObject==玩家)
{
audioSource.Stop();
音频源:PlayOneShot(splashInWater);
}
}
}
注意:我在inspector中分配给了玩家角色的游戏对象

我相信有一个简单的方法可以做到这一点。我还没有找到解决问题的办法


非常感谢您的帮助

实现这一点的一种方法是使用标签。将标签指定给玩家游戏对象,如下所示:

您可以通过下拉列表并选择“添加标签”来添加自己的标签,然后单击小加号按钮添加自己的标签:

然后,您可以检查碰撞对象是否具有如下所示的“玩家”标记:

public void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        //do something
    }
}
 private void OnTriggerEnter(Collider collider)
    {
        if (collider == playerCollider)
        {
            audioSource.PlayOneShot(splashInWater);
        }
    }

实现这一点的一种方法是使用标签。将标签指定给玩家游戏对象,如下所示:

您可以通过下拉列表并选择“添加标签”来添加自己的标签,然后单击小加号按钮添加自己的标签:

然后,您可以检查碰撞对象是否具有如下所示的“玩家”标记:

public void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        //do something
    }
}
 private void OnTriggerEnter(Collider collider)
    {
        if (collider == playerCollider)
        {
            audioSource.PlayOneShot(splashInWater);
        }
    }

我不确定我是否理解您的问题,但看起来您可以使用

public Collider playerCollider;
而不是

public GameObject player;
您可以指定哪个碰撞器将“负责”触发音频

OnTiggerEnter可能是这样的:

public void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        //do something
    }
}
 private void OnTriggerEnter(Collider collider)
    {
        if (collider == playerCollider)
        {
            audioSource.PlayOneShot(splashInWater);
        }
    }

我不确定我是否理解您的问题,但看起来您可以使用

public Collider playerCollider;
而不是

public GameObject player;
您可以指定哪个碰撞器将“负责”触发音频

OnTiggerEnter可能是这样的:

public void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        //do something
    }
}
 private void OnTriggerEnter(Collider collider)
    {
        if (collider == playerCollider)
        {
            audioSource.PlayOneShot(splashInWater);
        }
    }

您当前的解决方案已经相当可靠了

有一个小错误,触发器的方法与冲突的方法具有不同的签名。它们使用
碰撞器其他
而不是
碰撞
。我猜您是从碰撞开始原型设计的,并且在打开触发器标志后忘记了更改方法签名。这种情况也经常发生在我身上,即使在几年的游戏开发经验之后

除此之外,我不认为我可以为您的实现提供任何显著的改进。这已经差不多是应该做的了

因此,intead,我将为您提供一些见解,让您了解如何不必每次都从头开始编写代码。让我们让您的系统更易于重用,好吗?下面是我如何编写代码:

公共类音频触发器:单行为{
#区域字段
[SerializeField]专用音频源\u音频源;
[SerializeField]私人音频剪辑\u音频剪辑;
[SerializeField]专用列表_targetCollider;
#端区
#区域属性
公共音频源音频源{
get=>\u音频源;
set=>\u audioSource=值;
}
公共音频剪辑{
获取=>\u音频剪辑;
设置=>\u音频剪辑=值;
}
公共列表TargetColliders=>\u TargetColliders;
#端区
#区域方法
#区域实例方法
专用空对撞机(对撞机其他){
if(TargetColliders.Count==0 | | TargetColliders.Contains(其他))
音频源:PlayOneShot(音频剪辑);
}
私有无效OnTriggerExit(碰撞器其他){
if(TargetColliders.Count==0 | | TargetColliders.Contains(其他)){
AudioSource.Stop();
音频源:PlayOneShot(音频剪辑);
}
}
#端区
#端区
}
现在,无论何时何地,只要您需要一个触发器来播放音频,您就可以在任何触发器事件(通过设置无目标碰撞器)或特定“目标”碰撞器的进入和退出事件中插入该脚本


通过使用,这可以进一步模块化,作为任何动作或动作集的触发器,而不仅仅是音频。但我将把它留给您作为练习。

您当前的解决方案已经相当可靠了

有一个小错误,触发器的方法与冲突的方法具有不同的签名。它们使用
碰撞器其他
而不是
碰撞
。我猜您是从碰撞开始原型设计的,并且在打开触发器标志后忘记了更改方法签名。这种情况也经常发生在我身上,即使在几年的游戏开发经验之后

除此之外,我不认为我可以为您的实现提供任何显著的改进。这已经差不多是应该做的了

因此,intead,我将为您提供一些见解,让您了解如何不必每次都从头开始编写代码。让我们让您的系统更易于重用,好吗?下面是我如何编写代码:

公共类音频触发器:单行为{
#区域F