tduk, тебе необходимо отложить проект в сторону и внимательно заняться изучением Unity, ознакомиться и понять базовые уроки по работе с 2D в данной среде. Говорю это отнюдь не с напыщенностью и надменностью, а исключительно из желания помочь, потому как сейчас у тебя в корне неверное представление.
Во-первых, если работаешь с 2D, то и использовать надо соответствующие классы и компоненты: RaycastHit2D, Physics2D и т.д. Во-вторых, объекты участвующие в raycast'е обязательно должны иметь collider (в данном случае, какой-нибудь из 2D коллайдеров). В-третьих, разберись с алгоритмом. У тебя здесь получается следующее:
Код
Если есть объект на пути луча, то ... Двигаем объект в направлении луча
А должно быть совершенно наоборот. В-четвертых, в данном случае это не важно, но ты пускаешь бесконечный луч. Это означает, что даже если рядом слева от спрайта есть пустое место, а где-то далеко имеется стена, то raycast'вернёт тебе именно стену. Тебе ещё нужен параметр distance. В-пятых, при работе с 2D, использовать координату Z стоит только в исключительных случаях. В твоём же случае, оптимальным вариантом будет работа с layermask'ами и tag'ами. Узнать про них больше сможешь из тех же уроков Unity. В-шестых, вот пример рабочего скрипта для управления объектом (проверяет, нет ли рядом любых других объектов с collider'ом):
Код
public class HeroScript : MonoBehaviour {
void Move (Vector2 dir) { RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, 1); if (hit.collider == null) transform.Translate(dir); }
void FixedUpdate () { float x = Input.GetAxisRaw("Horizontal"); float y = Input.GetAxisRaw("Vertical"); Move(new Vector2(x, y)); } }
Сообщение отредактировал Rean - Пятница, 13 Января 2017, 01:16