Отразить 2D-персонажа с помощью инверсной кинематики в Unity

У меня есть сфальсифицированный 2D-персонаж с Sprites And Bones в Unity, и я использую инверсную кинематику для его анимации.

Но если я хочу перевернуть ось X, мой персонаж сойдет с ума:

IK листать

У меня есть скрипт, прикрепленный к "Karateka", содержащий простую функцию Flip():

public void Flip(){
    facingRight = !facingRight;
    Vector3 karatekaScale = transform.localScale;
    karatekaScale.x *= -1;
    transform.localScale = karatekaScale;
}
  • «Каратека» — это просто контейнер для костей, спрайтов и ИК-мишеней.
  • «Скелет» содержит сценарий Skeleton из Sprite And Bones.
  • «Кость правой ноги», «Кость правой голени» и т. Д. Имеют кость и IK-скрипты.
  • "Правая нога", "Правая голень" и т.д. - это спрайты
  • "IK" содержит все цели IK

У меня такой же эффект с другим скриптом IK, Simple CCD, из Unite 2014 — 2D Best Practices In Unity, так что я могу просто сделать что-нибудь глупое.

Что я могу сделать, чтобы правильно перевернуть моего персонажа?

РЕДАКТИРОВАТЬ (для Марка):

Я заставил его работать, используя это:

public void Flip(){
    facingRight = !facingRight;
    /*
    Vector3 karatekaScale = transform.localScale;
    karatekaScale.x *= -1;
    transform.localScale = karatekaScale;
    */

    GameObject IK = GameObject.Find ("IK");
    GameObject skeleton = GameObject.Find ("Skeleton");

    Vector3 ikScale = IK.transform.localScale;
    ikScale.x *= -1;
    IK.transform.localScale = ikScale;

    if (facingRight) {
        skeleton.transform.localEulerAngles = new Vector3(skeleton.transform.localEulerAngles.x, 180.0f, skeleton.transform.localEulerAngles.z);
    } else {
        skeleton.transform.localEulerAngles = new Vector3(skeleton.transform.localEulerAngles.x, 0.0f, skeleton.transform.localEulerAngles.z);
    }
}

person Cyrille    schedule 10.10.2016    source источник
comment
Есть ли причина, по которой вы хотите закодировать это вместо использования flipX/flipY Sprite Renderer? docs.unity3d.com/ScriptReference/SpriteRenderer.html то же самое происходит? Вы дважды проверяли свои IK и мишени (каждый IK и кость)?   -  person    schedule 10.10.2016
comment
Я не понимаю: у меня нет SpriteRenderer компонента на моей каратистке GameObject. У меня по 3 SpriteRenderer на каждую конечность (всего 12) + еще несколько на части туловища и головы. Например, каждая правая нога, правая голень и правая ступня имеют свои собственные SpriteRenderer. Если я переверну один, он будет перевернут только локально. Я попытался добавить elmpty Sprite Renderer к верхнему объекту karateka, но безуспешно. Я тоже пробовалGetComponent<SpriteRenderer> ().flipX = true;. Я еще раз проверю все свои объекты, но, поскольку он работает в одном направлении, я думаю, он должен работать в обоих.   -  person Cyrille    schedule 10.10.2016
comment
Похоже, вы не все переворачиваете и/или неправильно сбрасываете кости. Анимация слишком быстрая для моих глаз, но мне кажется, что некоторые кости застряли на месте и продолжают указывать в одном и том же направлении (т.е. не переворачиваются и не перемещаются - начало вашего спрайта в 0?). Поскольку вы делаете это из кода, вы также можете вывести все данные из всего дерева с помощью Debug.Log, чтобы увидеть, что застряло на месте. Если ничего, это тоже информация   -  person    schedule 10.10.2016
comment
Возможно, вы поставили меня на правильный путь. Скрипт Skeleton имеет флажок режима редактирования. Когда он установлен, и я переворачиваю своего персонажа с помощью scale.x *= -1, я вижу, что все, кроме костей, перевернуто. Так что только спрайты и цели ИК. Теперь в моей функции Flip() я переворачиваю только верхний IK GameObject, и это намного лучше, за исключением того, что мои спрайты, конечно, все еще в неправильном направлении. Я заметил кнопку Flip() в инспекторе игровых объектов Sprites And Bones, которая переворачивает все спрайты. Я все еще не могу запустить его из кода. В худшем случае я зациклюсь на всех SpriteRenderer.   -  person Cyrille    schedule 10.10.2016
comment
Я заставил его работать, используя код, который я поставил в конце своего вопроса. Вы можете скопировать/вставить его в ответ, чтобы я мог его принять. Спасибо за ваше время!   -  person Cyrille    schedule 10.10.2016
comment
Отличные новости, что вы это исправили (надеюсь, я скоро смогу купить игру! Еще раз спасибо, что поделились, и все еще рад, что смог помочь :)   -  person    schedule 10.10.2016


Ответы (2)


Итак, как мы обсуждали в комментариях, просто подведем итог:
1) Вы не все переворачиваете и/или не сбрасываете кости правильно, поэтому анимация "разваливается" при перелистывании
2 ) Можно сделать SpriteRenderer.flip[X/Y], но это нужно сделать для каждого элемента спрайта
3) Скрипт скелета имеет флажок "Режим редактирования". Когда этот флажок установлен и персонаж переворачивается с помощью scale.x *= -1, можно увидеть, что все, кроме костей, перевернуто.

И последнее, но не менее важное: вопрос был обновлен фрагментом кода, предоставляющим «решение на уровне кода» для проблемы.

Спасибо, что поделились всеми подробностями, Кирилл, и я рад, что смог помочь.

person Community    schedule 10.10.2016

Также можно просто повернуть корень префаба (здесь Каратека) на 180° по оси Y.

2D-спрайт на самом деле представляет собой 2-стороннюю 3D-сетку, поворот их на 180 ° по оси Y делает то же самое, что и переворот рендера, и если IK привязан к корню объекта, они будут следовать повороту, и все анимации будут работать. .

person Jirika    schedule 28.06.2021