#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, если у вас нет причин не делать этого.