Основы анимации персонажа в Юнити.

Научился сам? Помоги начинающему.

Основы анимации персонажа в Юнити.

Сообщение gerasim 03 дек 2009, 01:12

Начнём с движения от первого лица(FirstPersonShooter).
Строим плоскость и добавляем префаб "First Person Controller" из стандартных ассетов в сцену. Он включает сразу камеру, скрипт движения "FPSWalker", Character Controller и пустой геймобъект(пока вместо персонажа).
Всё, теперь можно двигатся по плоскости, используя стрелки или WSAD.
Вот (js) скрипт FPSWalker.js
Код: Выделить всё
var speed = 6.0;
var jumpSpeed = 8.0;
var gravity = 20.0;

private var moveDirection = Vector3.zero;
private var grounded : boolean = false;

function FixedUpdate() {
   if (grounded) {
      // We are grounded, so recalculate movedirection directly from axes
      moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
      moveDirection = transform.TransformDirection(moveDirection);
      moveDirection *= speed;
      
      if (Input.GetButton ("Jump")) {
         moveDirection.y = jumpSpeed;
      }
   }

   // Apply gravity
   moveDirection.y -= gravity * Time.deltaTime;
   
   // Move the controller
   var controller : CharacterController = GetComponent(CharacterController);
   var flags = controller.Move(moveDirection * Time.deltaTime);
   grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}

@script RequireComponent(CharacterController)


Авот его аналог на (c#)
Код: Выделить всё
using UnityEngine;
using System.Collections;

[RequireComponent (typeof (CharacterController))]

public class FPSWalkerC : MonoBehaviour {
   
public float speed = 6.0f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;

private Vector3 moveDirection = Vector3.zero;
private bool grounded = false;

void FixedUpdate() {
   if (grounded) {
      // We are grounded, so recalculate movedirection directly from axes
      moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
      moveDirection = transform.TransformDirection(moveDirection);
      moveDirection *= speed;
      
      if (Input.GetButton ("Jump")) {
         moveDirection.y = jumpSpeed;
      }
   }

   // Apply gravity
   moveDirection.y -= gravity * Time.deltaTime;
   
   // Move the controller
   CharacterController controller = GetComponent(typeof(CharacterController)) as CharacterController;
   CollisionFlags flags = controller.Move(moveDirection * Time.deltaTime);
   grounded = (flags & CollisionFlags.CollidedBelow) != 0;

  }   
}   


Смотрим как сделан перевод, и начинаем писАть свои скрипты на Шарпе. Успехов).
Последний раз редактировалось gerasim 09 дек 2009, 00:55, всего редактировалось 1 раз.
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара

Re: Основы анимации в Юнити.

Сообщение gerasim 06 дек 2009, 16:01

Теперь от третьего лица( ThirdPersonShooter).
Грузим уровень, на него кидаем персонажа в таком формате:
модель - goober.fbx, и к нему три анимации - goober@idle.fbx, goober@walk.fbx, goober@jump.fbx.
На камеру вешаем скрипт ThirdPersonCamera.cs - она отслеживает персонажа на некотором расстоянии.
На перса вешаем два скрипта - ThirdPersonController.cs(для управления клавишами), и ThirdPersonAnimations.cs(он смешивает именно эти три анимации). Теперь можно ходить и прыгать.
Посмотреть тут

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://h1.ripway.com/gerasim/unity3d/LocoSystem/TPS.unity3d&w=600&h=400&t=true&preview=1' height='"+(400+30)+"' width='600' frameborder='0' scrolling='no'></iframe>"); </script>
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара

Re: Основы анимации в Юнити.

Сообщение Neodrop 06 дек 2009, 18:11

Ни то ни то не загрузилось...
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Основы анимации в Юнити.

Сообщение gerasim 06 дек 2009, 20:34

Низнай, и Мозилле и в Опере вроде отрываетца. Интересно што одинаковые (js) и (c#) скрипты не меняют фпс - ну может пример нетяжолый, или такак итам итам МОНО.
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара

Re: Основы анимации персонажа в Юнити.

Сообщение Александр 14 янв 2010, 20:45

Может кто нибудь подробно и желательно с самых основ объяснить, как правильно реализовать анимацию, плавные переходы между ними(если не ощибаюсь, смешивание) и можно ли на один скелет(но разные его части), наложить разные анимации? Просто очень интересно. планирую на одну модель нацеплить около 40 телодвижений, причем некоторые из них должны как бы "вытекать" из других:)
Александр
UNец
 
Сообщения: 16
Зарегистрирован: 05 янв 2010, 20:10

Re: Основы анимации персонажа в Юнити.

Сообщение Александр 14 янв 2010, 21:02

Допустим на оф. сайте, в том же самом примере http://unity3d.com/support/resources/example-projects/character-animation, только сцена под названием "WalkRunIdleBlend", персонаж двигается и анимируется с помощью других методов: Вот

Управление:
(js)
Код: Выделить всё
var speed = 3.0;
var rotatationSpeed = 200.0;
var height = 5;
private var curSpeed = 0.0;

function Update () {
   // Rotate around y-axis
   var newRotation = Input.GetAxis("Horizontal") * rotatationSpeed;
   transform.Rotate(0, newRotation * Time.deltaTime, 0);
   
   

   // Calculate speed
   var newSpeed = Input.GetAxis("Vertical") * speed;
   if (Input.GetKey("left shift"))
      newSpeed *= 1.5;

   // Move the controller
   var controller : CharacterController = GetComponent (CharacterController);
   var forward = transform.TransformDirection(Vector3.forward);
   controller.SimpleMove(forward * newSpeed);
   
   // Update the speed in the Animation script
   SendMessage("SetCurrentSpeed", newSpeed, SendMessageOptions.DontRequireReceiver);
   SendMessage("SetCurrentLean", Input.GetAxis("Horizontal"), SendMessageOptions.DontRequireReceiver);
}

@script RequireComponent (CharacterController)


Анимация:
(js)
Код: Выделить всё
var walkSpeed = 2.3;
var runSpeed = 3.6;
var idleThreshold = 0.3;
var speedSmoothing = 8.0;


private var run : AnimationState;
private var walk : AnimationState;
private var leanLeft : AnimationState;
private var leanRight : AnimationState;

private var currentSpeed = 0.0;
private var smoothedSpeed = 0.0;
private var currentLean = 0.0;
private var smoothedLean = 0.0;

function SetCurrentSpeed ( newSpeed : float)
{
   currentSpeed = newSpeed;
}

function SetCurrentLean ( newSpeed : float)
{
   currentLean = newSpeed;
}


function Start ()
{
   // We are in full control here - don't let any other animations play when we start
   animation.Stop();

   // By default loop all animations
   animation.wrapMode = WrapMode.Loop;

   walk = animation["walk"];
   run = animation["runSlow"];

   leanLeft = animation["leanLeft"];
   leanRight = animation["leanRight"];

   // Do we actually have leaning animations? They are not necessary   
   if (leanLeft)
   {
      leanLeft.blendMode = AnimationBlendMode.Additive;
      leanRight.blendMode = AnimationBlendMode.Additive;
      leanLeft.wrapMode = WrapMode.ClampForever;
      leanRight.wrapMode = WrapMode.ClampForever;
      leanLeft.layer = 100;
      leanRight.layer = 100;
      leanLeft.weight = 1;
      leanRight.weight = 1;
      leanLeft.enabled = true;
      leanRight.enabled = true;
   }

   // Enable all walk / run cycles
   // We will manually adjust the blend weights every frame
   walk.enabled = true;
   run.enabled = true;

   // Synchronize all walk / run cycle animations
   animation.SyncLayer(0);

   // Put the idle animation in a lower layer.
   // This will make it only play if no walk / run cycle is faded in
   animation["idle"].layer = -1;
   animation["idle"].enabled = true;
   animation["idle"].weight = 1;
}

function Update () {
   smoothedSpeed = Mathf.Lerp(smoothedSpeed, currentSpeed, Time.deltaTime * speedSmoothing);

   // Calculate the weight between walk and run from the current speed
   var runWeight = Mathf.InverseLerp(walkSpeed, runSpeed, Mathf.Abs(smoothedSpeed));
   
   // Only fast running animations get the lean added on top. A walking human does not lean
   var targetLean = currentLean * runWeight;
   smoothedLean = Mathf.Lerp(smoothedLean, targetLean, Time.deltaTime * speedSmoothing);
   
   // adjust the animation playback to match the characters speed
   run.speed = smoothedSpeed / runSpeed;
   walk.speed = smoothedSpeed / walkSpeed;

   // When the character slows down fade out the run and walk weights
   if (Mathf.Abs(smoothedSpeed) < idleThreshold)
   {
      run.weight  -= Time.deltaTime * 5.0;
      walk.weight -= Time.deltaTime * 5.0;
   }
   else
   {
      var totalWeight = run.weight + walk.weight;
      totalWeight += Time.deltaTime * 12;
      totalWeight = Mathf.Clamp01(totalWeight);

      // Set the weights based on the current speed
      run.weight = runWeight * totalWeight;
      walk.weight = (1.0 - runWeight) * totalWeight;
   }

   if (leanLeft)   
   {
      if (smoothedLean > 0)
      {
         leanLeft.normalizedTime = 0;
         leanRight.normalizedTime = smoothedLean;
      }
      else
      {
         leanLeft.normalizedTime = -smoothedLean;
         leanRight.normalizedTime = 0;
      }
   }
}


Каким все таки методом реализовать большое колличество подключаемых анимаций:(?
Александр
UNец
 
Сообщения: 16
Зарегистрирован: 05 янв 2010, 20:10

Re: Основы анимации персонажа в Юнити.

Сообщение Neodrop 14 янв 2010, 21:12

Animation.CrossFadeQueued
Animation.CrossFade
Animation.Blend
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Основы анимации персонажа в Юнити.

Сообщение gerasim 14 янв 2010, 23:06

Александр писал(а):Может кто нибудь подробно и желательно с самых основ объяснить, как правильно реализовать анимацию, плавные переходы между ними(если не ощибаюсь, смешивание) и можно ли на один скелет(но разные его части), наложить разные анимации? Просто очень интересно. планирую на одну модель нацеплить около 40 телодвижений, причем некоторые из них должны как бы "вытекать" из других:)


Начните с двух анимацый в формате описанном выше для ВАШЕЙ модели. Сорок всегда успеете). В примере с оффсайта 1 сцена - работает у вас на (js) ? Во второй у меня тоже были проблемы. Походите пока Сёрд Персоном)
Пишите, што со второй сценой неполучилось.
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара


Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2