Не двигается персонаж [Решено]
|
|
Leyron | Дата: Воскресенье, 17 Мая 2015, 14:23 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте! Периодически бывает следующая проблема: персонаж не двигается с места, но все анимации проигрываются(нажимаю D анимация ходьбы есть, а движения нет), обычно решал это просто загружая старую версию проекта, но на этот раз случайно сохранил. Эта байда уже надоела, может быть кто-нибудь сталкивался с подобным и поможет решить. P.S. игра 2D, все анимации записывались в Unity
Добавлено (17 мая 2015, 14:23) --------------------------------------------- Ещё кое-что: в компоненте Animator, при добавлении ранее рабочего контроллера, появляется надпись "Root position or rotation are controlled by curves".
|
|
| |
beril | Дата: Воскресенье, 17 Мая 2015, 17:25 | Сообщение # 2 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| У тебя персонаж двигается кодом или анимацией ? Код в студию
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Leyron | Дата: Воскресенье, 17 Мая 2015, 20:05 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Кодом
Код using UnityEngine; using System.Collections;
public class CharMove : MonoBehaviour { public float jump_force; public float speed_run;
public Transform rayEnd1; public Transform rayEnd2; public Transform rayEnd3;
public Transform pl; private bool isGround = true; private Vector3 moving;
private Animator anim; private Rigidbody2D phys; void Start () { anim = GetComponent<Animator> (); phys = GetComponent<Rigidbody2D> (); }
void FixedUpdate () { Movement (); Phys (); RayCasting (); }
void Movement() { anim.SetBool("Run", false); if (Input.GetKey(KeyCode.D)) { pl.transform.localPosition += (Vector3)Vector2.right * speed_run * Time.deltaTime; pl.transform.eulerAngles = new Vector2(0, 0); anim.SetBool("Run", true); } else if (Input.GetKey(KeyCode.A)) { pl.transform.localPosition -= (Vector3)Vector2.right * speed_run * Time.deltaTime; pl.transform.eulerAngles = new Vector2(0, 180); anim.SetBool("Run", true); }
if (Mathf.Abs (pl.rotation.eulerAngles.z) >= 15 && Mathf.Abs (pl.rotation.eulerAngles.z) <= 345) { pl.transform.eulerAngles = new Vector3 (0, pl.transform.eulerAngles.y, 15); phys.fixedAngle = true; } else phys.fixedAngle = false;
} void Phys() { anim.SetBool ("isGround", isGround); if (Input.GetKeyDown (KeyCode.Space) && isGround == true) { phys.AddForce (Vector2.up * jump_force, ForceMode2D.Impulse); anim.SetBool ("Jump", true); } else if (isGround == true) { anim.SetBool ("Jump", false); } else { anim.SetBool ("Jump", true); } }
void RayCasting() { isGround = Physics2D.Linecast (pl.transform.position, rayEnd1.position, 1 << LayerMask.NameToLayer("Ground")); if (isGround == false) isGround = Physics2D.Linecast (pl.transform.position, rayEnd2.position, 1 << LayerMask.NameToLayer("Ground")); if (isGround == false) isGround = Physics2D.Linecast (pl.transform.position, rayEnd3.position, 1 << LayerMask.NameToLayer("Ground")); Debug.DrawLine (pl.transform.position, rayEnd1.position, Color.blue); Debug.DrawLine (pl.transform.position, rayEnd2.position, Color.blue); Debug.DrawLine (pl.transform.position, rayEnd3.position, Color.blue);
} }
pl - это персонаж
Сообщение отредактировал Leyron - Воскресенье, 17 Мая 2015, 20:10 |
|
| |
beril | Дата: Воскресенье, 17 Мая 2015, 20:33 | Сообщение # 4 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Попробуй метод Movent в Update вызывать, ну или Time.deltaTime убери pl.transform.localPosition += (Vector3)Vector2.right * speed_run * Time.deltaTime; - разве такое приведение типов возможно ?
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Leyron | Дата: Воскресенье, 17 Мая 2015, 21:06 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Цитата beril ( ) pl.transform.localPosition += (Vector3)Vector2.right * speed_run * Time.deltaTime; - разве такое приведение типов возможно ? Да, возможно, но я даже не знаю зачем так сделал, изменил на Vector3.right
Цитата beril ( ) Попробуй метод Movent в Update вызывать, ну или Time.deltaTime убери Попробовал всё выше сказанное, тщетно.
Заметил одну вещь, если поставить галочку на Apply Root Motion в компоненте Animator, то персонаж начинает двигаться, но тогда анимация не совсем так работает. При Apply Root Motion персонаж нормально двигается, но постепенно поднимается вверх(взлетает) и не реагирует на пробел(не прыгает).
|
|
| |
beril | Дата: Воскресенье, 17 Мая 2015, 21:59 | Сообщение # 6 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата Leyron ( ) Apply Root Motion Ну это параметр отвечает за то, что будет управлять положение обьекта (анимация или код)
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Leyron | Дата: Понедельник, 18 Мая 2015, 00:07 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| Я планировал управлять кодом Добавлено (18 мая 2015, 00:07) --------------------------------------------- Проблему решил следующим образом: во всех анимациях персонажа удалил анимацию главного в иерархии объекта, тобишь все части остались анимироваными Видимо делалась привязка к позиции всего персонажа в анимации
beril'у лайк за то, что пытался помочь
|
|
| |
Storm54 | Дата: Среда, 20 Мая 2015, 06:34 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| Apply root motion мог помочь
|
|
| |
Leyron | Дата: Суббота, 23 Мая 2015, 09:57 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| У меня все анимации персонажа были записаны на месте, а как я понимаю, root motion нужно юзать, если у тебя в анимации происходит смена координат персонажа. А т.к. я всё передвижение(в том числе прыжок), осуществлял с помощью кода, root motion не работал так как надо.
|
|
| |