- 2022.03.28 Monday
- スポンサーサイト
-
一定期間更新がないため広告を表示しています
- | スポンサードリンク | - | | - | - | pookmark |
- 2014.12.30 Tuesday
- Mecanim Locomotion Starter Kitのスクリプトを日本語解釈してみた。
-
Mecanim Locomotion Starter Kit
https://www.assetstore.unity3d.com/jp/#!/content/7673
/// <summary>
///
/// </summary>
using UnityEngine;
using System;
using System.Collections;
[RequireComponent(typeof(Animator))]
//Name of class must be name of file as well
public class LocomotionPlayer : MonoBehaviour {
protected Animator animator;
private float speed = 0;
private float direction = 0;
private Locomotion locomotion = null;
// Use this for initialization
void Start ()
{
animator = GetComponent<Animator>();
locomotion = new Locomotion(animator);
}
void Update ()
{
if (animator && Camera.main)
{
JoystickToEvents.Do(transform,Camera.main.transform, ref speed, ref direction);
locomotion.Do(speed * 6, direction * 180);
}
}
}
短いと思ったら。
Locomotionて独自のAnimeter継承クラスを作っている。。三項演算子だらけだったので理解のためばらした。
using UnityEngine;
using System.Collections;
public class Locomotion
{
private Animator m_Animator = null;
private int m_SpeedId = 0;
private int m_AgularSpeedId = 0;
private int m_DirectionId = 0;
public float m_SpeedDampTime = 0.1f;
public float m_AnguarSpeedDampTime = 0.25f;
public float m_DirectionResponseTime = 0.2f;
public Locomotion (Animator animator)
{
m_Animator = animator;
m_SpeedId = Animator.StringToHash ("Speed");//Animaterに設定したフロートの名称
m_AgularSpeedId = Animator.StringToHash ("AngularSpeed");//Animaterに設定したフロートの名称
m_DirectionId = Animator.StringToHash ("Direction");//Animaterに設定したフロートの名称
}
//Updateで呼ばれる関数。
public void Do (float speed, float direction)
{
AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo (0);
bool inTransition = m_Animator.IsInTransition (0);//stateが切り替わるトランジション中かどうか?
bool inIdle = state.IsName ("Locomotion.Idle");//アイドル状態かどうか?
//bool inTurn = state.IsName("Locomotion.TurnOnSpot") || state.IsName("Locomotion.PlantNTurnLeft") || state.IsName("Locomotion.PlantNTurnRight");
bool inTurn = false;
if (state.IsName ("Locomotion.TurnOnSpot")) {//回転状態のとき
inTurn = true;
}
if (state.IsName ("Locomotion.PlantNTurnLeft")) {//左切り返しのとき
inTurn = true;
}
if (state.IsName ("Locomotion.PlantNTurnRight")) {//右切り返しのとき
inTurn = true;
}
bool inWalkRun = state.IsName ("Locomotion.WalkRun");//走ってるとき
//-------------------------------------------speedDampTime
//float speedDampTime = inIdle ? 0 : m_SpeedDampTime;
float speedDampTime;
if (inIdle) {
speedDampTime = 0;//アイドルのときダンプは
} else {
speedDampTime = m_SpeedDampTime;//アイドルじゃないときm_SpeedDampTime = 0.1f;
}
//------------------------------------------angularSpeedDampTime
//float angularSpeedDampTime = inWalkRun || inTransition ? m_AnguarSpeedDampTime : 0;
float angularSpeedDampTime;
angularSpeedDampTime=0;//
if(inWalkRun){
angularSpeedDampTime = m_AnguarSpeedDampTime;//歩いてるとき m_AnguarSpeedDampTime = 0.25f;
}
if(inTransition){
angularSpeedDampTime = m_AnguarSpeedDampTime;//トランジション中のときm_AnguarSpeedDampTime = 0.25f;
}
//----------------------------------------directionDampTime
//float directionDampTime = inTurn || inTransition ? 1000000 : 0;
float directionDampTime;
directionDampTime=0;
if(inTurn){
directionDampTime = 1000000;//ターン中のとき 1000000
}
if(inTransition){
directionDampTime = 1000000;//トランジション中のとき 1000000
}
float angularSpeed = direction / m_DirectionResponseTime;
///////////SetFloat(string name, float value, float dampTime(時間に到達するためのパラメータ), float deltaTime(時間));
m_Animator.SetFloat (m_SpeedId, speed, speedDampTime, Time.deltaTime);
m_Animator.SetFloat (m_AgularSpeedId, angularSpeed, angularSpeedDampTime, Time.deltaTime);
m_Animator.SetFloat (m_DirectionId, direction, directionDampTime, Time.deltaTime);
}
}
SetFloatの引数は2つでもいいが4つにすることで切り返しの動作を可能にしているようだ。
Animator.SetFloat
SetFloat(文字列名、フロート値);パラメータ名前 パラメータの名前。 値 パラメータの新しい値。 説明フロート·パラメータの値を設定します。
SetFloat(文字列名、フロート値、フロートdampTime、フロートdeltaTime);パラメータ名前 パラメータの名前。 値 パラメータの新しい値。 dampTime 時間値に到達するためにパラメーターさせた。 deltaTime 現在のフレームdeltaTime。 説明フロート·パラメータの値を設定します。
実際2つしか引数を使わないと
切り返しの動作がなくなる
- | whaison | - | 23:42 | comments(0) | - | pookmark |
- Comment