Создание экземпляра GameObjects и изменение материала при попадании на землю

#unity3d

#unity3d

Вопрос:

Существует код для создания экземпляра куба в списке и изменения материала каждого клона при попадании на землю

Следующий код работает, но не в режиме реального времени. Функция обновления работает как функция запуска для метода Foreach

Как получить значение item.transform.position.y в функции обновления в режиме реального времени?

 public GameObject cubePrefab;
public Material RedMat;
public float GroudLevel = 0.5f;

void Update()
{
    if (Input.GetMouseButtonDown(0))
    { 
         List<GameObject> cloneList = new List<GameObject>();
         //instantiate clones into the list
         for (int i = 0; i < 10; i  )
         {
            var clone = Instantiate (cubePrefab,new Vector3(Random.Range(-3f, 3f),
            Random.Range(4f, 10.5f),Random.Range(-3f, 3f)), Quaternion.identity);
            cloneList.Add(clone);
         }

         //if clone is grounded change a Material for each clone
         foreach (var item in cloneList)
         {
            //Debug.Log(item.transform.position.y);

            //check if clone is on the ground
            if(item.transform.position.y < GroudLevel)
            {
             item.GetComponent<Renderer>().material = RedMat;
            }
            
        }  

    }
}
 

Существует скриншот для GroudLevel = 7

введите описание изображения здесь

Ответ №1:

Причина, по которой эта функция не работает, заключается в том, что pivot ( transform.position ) вашего элемента всегда находится в центре объекта. Это не то, что вы можете изменить в Unity (и вам не обязательно этого хотеть).

Кроме того, вы проверяете, находится ли элемент под землей, а не на ней, когда используете < insteaad of <= , потому что позиция должна быть меньше, чем groundLevel для возврата true .

Здесь есть несколько решений.

Самым простым было бы перенести всю эту логику в OnCollisionEnter OnTriggerEnter метод or . Для получения дополнительной информации об этом ознакомьтесь с документацией Unity .

Другим решением было бы найти способ определить размер объекта, разделить его на два и проверить, есть ли

 item.transform.position - halfSize <= groundLevel; 
 

Однако это кажется действительно громоздким и чрезмерно сложным. Вам было бы лучше использовать встроенную систему столкновений Unity, если у вас нет причин не делать этого.