Пятница, 15 Ноября 2024, 10:09

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Не двигается персонаж [Решено]
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'у лайк за то, что пытался помочь happy

Storm54Дата: Среда, 20 Мая 2015, 06:34 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Apply root motion мог помочь
LeyronДата: Суббота, 23 Мая 2015, 09:57 | Сообщение # 9
был не раз
Сейчас нет на сайте
У меня все анимации персонажа были записаны на месте, а как я понимаю, root motion нужно юзать, если у тебя в анимации происходит смена координат персонажа. А т.к. я всё передвижение(в том числе прыжок), осуществлял с помощью кода, root motion не работал так как надо.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг