Я генерирую массив сфер Gameobjct и пытаюсь применить к ним коллайдер, чтобы обнаружить столкновение с контроллером моего персонажа.
Я пробовал методы serverel, ничего не работало. Почему Unity обнаруживает столкновение?
Скрипт для генерации массива:
public GameObject[] Chunkzufall(float l, float b, int n)
{
GameObject chunk = new GameObject();
GameObject[] chunks = new GameObject[n];
chunkSpeed = new float[n];
chunkMaxH = new float[n];
chunkMinH = new float[n];
for (int j = 0; j < n; j++)
{
float h = 1;
float posX = Random.Range(0.0f, b);
float posZ = Random.Range(0.0f, l);
GameObject group = Chunk(h);
group.transform.Translate(posX, 0.0f, posZ);
group.transform.parent = chunk.transform;
chunk.tag = "reset";
chunk.name = "chunk";
chunkSpeed[j] = (float) Random.Range(-0.04f, 0.04f);
chunkMaxH[j] = (float) Random.Range(2.0f, 10.0f);
chunkMinH[j] = (float) Random.Range(-2.0f, -10.0f);
chunk.AddComponent<SphereCollider>();
chunk.GetComponent<SphereCollider>().isTrigger = true;
chunk.GetComponent<SphereCollider>().radius = 5.0f;
chunks[j] = chunk;
}
return chunks;
}
public void MoveChunks(GameObject[] chunks)
{
int i = 0;
foreach(GameObject chunk in chunks)
{
Vector3 position = chunk.transform.GetChild(i).position;
if (position.y >= chunkMaxH[i] || position.y <= chunkMinH[i])
{
chunkSpeed[i] = chunkSpeed[i] * -1;
}
position.y = position.y - chunkSpeed[i];
chunk.transform.GetChild(i).position = position;
chunk.GetComponent<SphereCollider>().center = position;
i++;
}
i = 0;
}
функция триггера столкновения:
private void OnTriggerEnter(Collider col) {
if (col.gameObject.tag == "reset") {
transform.position = new Vector3(startX, startY, startZ);
Debug.Log("chunk");
}
}
вам действительно стоит создать сборный объект и сэкономить немного кода ... но в любом случае. добавить жесткое тело к вашему chunks, я полагаю, к вашему плееру прикреплено жесткое тело? это должно устранить проблемы столкновения. если нет, я действительно не вижу никаких дочерних элементов, прикрепленных к чанку: * Vector3 position = chunk.transform.GetChild (i) .position; *





Для обнаружения триггера на динамически созданном объекте необходимо включить флаг IsTrigger, добавить к объекту коллайдер. К объекту также должен быть прикреплен Rigidbody. Похоже, у вас уже есть флаг IsTrigger и коллайдер, но вам не хватает Rigidbody.
Замените это:
chunk.AddComponent<SphereCollider>();
chunk.GetComponent<SphereCollider>().isTrigger = true;
chunk.GetComponent<SphereCollider>().radius = 5.0f;
с участием
chunk.AddComponent<SphereCollider>();
chunk.AddComponent<Rigidbody>(); //ADDS RIGIDBODY COMPONENT
chunk.GetComponent<SphereCollider>().isTrigger = true;
chunk.GetComponent<SphereCollider>().radius = 5.0f;
У вас есть Rigidbody? К объектам должен быть подключен Rigidbody, чтобы иметь возможность обнаруживать столкновения. И обратите внимание, что для каждой пары коллайдера и столкнувшихся объектов достаточно иметь один из них с прикрепленным Rigidbody, чтобы захватить событие. В вашем случае, если вы не хотите обрабатывать столкновение между сферами, достаточно прикрепить Rigidbody к объекту вашего персонажа.
Вы можете добавить RigidBody ко всем сферам, но это будет очень неэффективно, если вы хотите, чтобы их было много. Достаточно иметь 1 RigidBody на каждые 2 объекта, с которыми вы хотите проверить коллизию.
Так что в вашем случае было бы достаточно поместить компонент RigidBody в объект контроллера персонажа.
Также убедитесь, что RigidBody не установлен на кинематику.
Привет, @Lazy Male Я считаю, что эта почта объясняет, с чем вы сталкиваетесь, и предостережения относительно «телепортации» объекта, обновляя преобразовать. Надеюсь, установка скорость поможет :)