C# 实例化创建两个对象,而不是一个
我是Unity的新手,几天内我都解决不了一个问题。我在我的道路预制件中创建了触发器对象,它包含了一个以上的触发器和道路本身。当汽车与此对象进行OnTiggerEnter时,我会生成新的道路预制件,使其在z坐标上更进一步。我有一个道路预制件作为起始件,当我的车碰到第一个道路触发事件时,它会创建一个对象,当车碰到创建的预制件道路的触发件时,它会创建两个对象。总之,实例化对象触发器创建两个对象而不是一个 我可以通过脊梁骨,但我想知道为什么会这样C# 实例化创建两个对象,而不是一个,c#,unity3d,C#,Unity3d,我是Unity的新手,几天内我都解决不了一个问题。我在我的道路预制件中创建了触发器对象,它包含了一个以上的触发器和道路本身。当汽车与此对象进行OnTiggerEnter时,我会生成新的道路预制件,使其在z坐标上更进一步。我有一个道路预制件作为起始件,当我的车碰到第一个道路触发事件时,它会创建一个对象,当车碰到创建的预制件道路的触发件时,它会创建两个对象。总之,实例化对象触发器创建两个对象而不是一个 我可以通过脊梁骨,但我想知道为什么会这样 public class CreateNextRoad
public class CreateNextRoad : MonoBehaviour
{
public GameObject Road;
static float nextSpawnPoint = 149f;
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Player"))
{
float parentPos = transform.parent.transform.position.z;
Instantiate(Road, new Vector3(0f, 0f, nextSpawnPoint), Quaternion.Euler(0, 90, 0));
nextSpawnPoint = parentPos + 109f;
Debug.Log(nextSpawnPoint);
}
}
}
这是因为OnTiggerEnter。它计算两次。您可以使用以下选项:
public GameObject Road;
static float nextSpawnPoint = 149f;
public bool touched;
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Player")&&!touched)
{
float parentPos = transform.parent.transform.position.z;
Instantiate(Road, new Vector3(0f, 0f, nextSpawnPoint), Quaternion.Euler(0, 90, 0));
nextSpawnPoint = parentPos + 109f;
Debug.Log(nextSpawnPoint);
touched=true;
}
}
private void OnTriggerExit(Collider other)
{
if(other.CompareTag("Player")&&touched)
{
touched=false;
}
}
好的。。。。3个论坛帮不了我 我发现了如何使每件事都恰到好处。 其思想是从触发器子对象调用父对象内的spawn next object方法 父对象脚本:
public class SpawnNextRoad : MonoBehaviour
{
public GameObject Road;
static int roadCounter = 0;
public void SpawnFurtherRoad()
{
float nextSpawnPoint = transform.position.z + 109f;
Instantiate(Road, new Vector3(0f, -1f, nextSpawnPoint), Quaternion.Euler(0, 90, 0)).name = "Road" + roadCounter.ToString();
roadCounter++;
}
}
触发子脚本:
public class triggerSpawnRoad : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Player"))
{
transform.parent.GetComponent<SpawnNextRoad>().SpawnFurtherRoad();
}
}
}
公共类触发器:单行为
{
专用空对撞机(对撞机其他)
{
如果(其他比较标记(“玩家”))
{
transform.parent.GetComponent().road();
}
}
}
好的,这就是方法的本机行为?我知道有人叫过两次,但为什么?为什么静态对象执行一次,实例化两次?实际上这不起作用,它是相同的结果,创建了两个对象。我不知道为什么会发生这种情况,但我有同样的问题。我就这样把它修好了。但我认为这是因为团结的速度不够快。