-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] Ragdoll Unity

, 04 2017 . 19:06 +
Ragdoll AnimationClip.



, - Drunken Monday. , , . .

, ragdoll , . . .

, , . 50-60 .
.

. , : ragdoll Unity, ?

, , .

.gif
image


Unity AnimationClip, AnimationCurve, , , localPosition.x. Keyframe.



, AnimationCurve, . AnimationClip AssetDatabase.CreateAsset.

AnimationRecorderItem, , .

Properties = new Dictionary ();
 
Properties.Add ( "localPosition.x", new AnimationCurve () );
Properties.Add ( "localPosition.y", new AnimationCurve () );
Properties.Add ( "localPosition.z", new AnimationCurve () );
 
Properties.Add ( "localRotation.x", new AnimationCurve () );
Properties.Add ( "localRotation.y", new AnimationCurve () );
Properties.Add ( "localRotation.z", new AnimationCurve () );
Properties.Add ( "localRotation.w", new AnimationCurve () );
 
Properties.Add ( "localScale.x", new AnimationCurve () );
Properties.Add ( "localScale.y", new AnimationCurve () );
Properties.Add ( "localScale.z", new AnimationCurve () );

:

Properties["localPosition.x"].AddKey (new Keyframe (time, _animObj.localPosition.x, 0.0f, 0.0f));
Properties["localPosition.y"].AddKey (new Keyframe (time, _animObj.localPosition.y, 0.0f, 0.0f));
Properties["localPosition.z"].AddKey (new Keyframe (time, _animObj.localPosition.z, 0.0f, 0.0f));
 
Properties["localRotation.x"].AddKey (new Keyframe (time, _animObj.localRotation.x, 0.0f, 0.0f));
Properties["localRotation.y"].AddKey (new Keyframe (time, _animObj.localRotation.y, 0.0f, 0.0f));
Properties["localRotation.z"].AddKey (new Keyframe (time, _animObj.localRotation.z, 0.0f, 0.0f));
Properties["localRotation.w"].AddKey (new Keyframe (time, _animObj.localRotation.w, 0.0f, 0.0f));
 
Properties["localScale.x"].AddKey (new Keyframe (time, _animObj.localScale.x, 0.0f, 0.0f));
Properties["localScale.y"].AddKey (new Keyframe (time, _animObj.localScale.y, 0.0f, 0.0f));
Properties["localScale.z"].AddKey (new Keyframe (time, _animObj.localScale.z, 0.0f, 0.0f));

, . . , , .

AnimationRecorderItem.cs

AnimationRecorder.
AnimationRecorder, relativePath AnimationClip.

relativePath :
Path to the game object this curve applies to. The relativePath is formatted similar to a pathname, e.g. root/spine/leftArm. If relativePath is empty it refers to the game object the animation clip is attached to.

:

private List _recorders;
 
void Start ()
{
	Configurate ();
}
 
void Configurate ()
{
	_recorders = new List ();
 
	var allTransforms = gameObject.GetComponentsInChildren< Transform > ();
	for ( int i = 0; i < allTransforms.Length; ++i )
	{
		string path = CreateRelativePathForObject ( transform, allTransforms [ i ] );
		_recorders.Add( new AnimationRecorderItem ( path, allTransforms [ i ] ) );
	}
}
 
private string CreateRelativePathForObject ( Transform root, Transform target )
{
	if ( target == root )
	{
		return string.Empty;
	}
 
	string name = target.name;
	Transform bufferTransform = target;
 
	while ( bufferTransform.parent != root )
	{
		name = string.Format ( "{0}/{1}", bufferTransform.parent.name, name );
		bufferTransform = bufferTransform.parent;
	}
	return name;
}

:

private float _recordingTimer;
private bool _recording = false;
 
void Update ()
{
 
	if ( _recording )
	{
		for ( int i = 0; i < _recorders.Count; ++i )
		{
			_recorders [ i ].AddFrame ( _recordingTimer );
		}
		_recordingTimer += Time.deltaTime;
	}
}

Update , .

30 .

.

private const float CAPTURING_INTERVAL = 1.0f / 30.0f;
 
private float _lastCapturedTime;
private float _recordingTimer;
private bool _recording = false;
 
void Update ()
{
	if ( Input.GetKeyDown ( KeyCode.Space ) && !_recording )
	{
		StartRecording ();
		return;
	}
 
	if ( _recording )
	{
		if (_recordingTimer==0.0f||_recordingTimer-_lastCapturedTime>=CAPTURING_INTERVAL)
		{
			for ( int i = 0; i < _recorders.Count; ++i )
			{
				_recorders [ i ].AddFrame ( _recordingTimer );
			}
			_lastCapturedTime = _recordingTimer;
		}
		_recordingTimer += Time.deltaTime;
	}
}
 
public void StartRecording ()
{
	Debug.Log ( "AnimationRecorder recording started" );
	_recording = true;
}

. AnimationClip .

private void ExportAnimationClip ()
{
	AnimationClip clip = new AnimationClip ();
	for ( int i = 0; i < _recorders.Count; ++i )
	{
		Dictionary propertiles = _recorders [ i ].Properties;
		for ( int j = 0; j < propertiles.Count; ++j )
		{
			string name = _recorders [ i ].PropertyName;
			string propery = propertiles.ElementAt ( j ).Key;
			var curve = propertiles.ElementAt ( j ).Value;
			clip.SetCurve ( name, typeof(Transform), propery, curve );
		}
	}
	clip.EnsureQuaternionContinuity ();
 
	string path = "Assets/" + gameObject.name + ".anim";
	AssetDatabase.CreateAsset ( clip, path );
	Debug.Log ( "AnimationRecorder saved to = " + path );
}

AnimationRecorder.cs

- AnimationRecorderRagdollHelper, , , . . , , - .

AnimationRecorderRagdollHelper.cs

, AnimationRecorderRagdollHelper , , , , , .

.



.



4-5 .

P. S. .
, . , , !


GitHub

YouTube

, Steam, Google Play, AppStore, Facebook .
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334922/

:  

: [1] []
 

:
: 

: ( )

:

  URL