Adventure Creator Wikia
(Initial post)
Tag: Visual edit
 
(Added support for the "offset" event parameter.)
Tag: Visual edit
 
Line 18: Line 18:
 
private Transform headTurnTarget;<br>
 
private Transform headTurnTarget;<br>
 
private LerpUtils.FloatLerp headWeightLerp = new LerpUtils.FloatLerp (true);<br>
 
private LerpUtils.FloatLerp headWeightLerp = new LerpUtils.FloatLerp (true);<br>
  +
private Vector3 offset;<br>
 
private float headWeight = 0f;<br>
 
private float headWeight = 0f;<br>
 
private const float headTurnSpeed = 5f;<br>
 
private const float headTurnSpeed = 5f;<br>
Line 52: Line 53:
 
if (headTurnTarget)<br>
 
if (headTurnTarget)<br>
 
{<br>
 
{<br>
lookAtIK.solver.IKPosition = headTurnTarget.position;<br>
+
lookAtIK.solver.IKPosition = headTurnTarget.position + offset;<br>
 
}<br>
 
}<br>
 
lookAtIK.solver.IKPositionWeight = headWeight;<br>
 
lookAtIK.solver.IKPositionWeight = headWeight;<br>
Line 63: Line 64:
 
#region PublicFunctions<br>
 
#region PublicFunctions<br>
 
<br>
 
<br>
public void SetLookAtTarget (Char character, Transform _headTurnTarget, Vector3 offset, bool isInstant)<br>
+
public void SetLookAtTarget (Char character, Transform headTurnTarget, Vector3 offset, bool isInstant)<br>
 
{<br>
 
{<br>
if (_headTurnTarget != null && character == this.character)<br>
+
if (headTurnTarget != null && character == this.character)<br>
 
{<br>
 
{<br>
headTurnTarget = _headTurnTarget;<br>
+
this.headTurnTarget = headTurnTarget;<br>
  +
this.offset = offset;<br>
 
<br>
 
<br>
 
if (isInstant)<br>
 
if (isInstant)<br>

Latest revision as of 01:34, 22 November 2017

This script allows characters to rely on FinalIK's Look At IK component when turning their head. To use it, add the Look At IK component to your character's base and configure it. Then, add the following code to the character, and assign the two fields.

FinalIKHeadTurn.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AC;
using RootMotion.FinalIK;

public class FinalIKHeadTurn : MonoBehaviour
{

#region Variables

[SerializeField] private LookAtIK lookAtIK;
[SerializeField] private Char character;

private Transform headTurnTarget;
private LerpUtils.FloatLerp headWeightLerp = new LerpUtils.FloatLerp (true);
private Vector3 offset;
private float headWeight = 0f;
private const float headTurnSpeed = 5f;

#endregion


#region UnityStandards

private void OnEnable ()
{
EventManager.OnSetHeadTurnTarget += SetLookAtTarget;
EventManager.OnClearHeadTurnTarget += ClearLookAtTarget;
}


private void OnDisable ()
{
EventManager.OnSetHeadTurnTarget -= SetLookAtTarget;
EventManager.OnClearHeadTurnTarget -= ClearLookAtTarget;
}


private void Update ()
{
headWeight = headWeightLerp.Update (headWeight, (headTurnTarget != null) ? 1f : 0f, headTurnSpeed);
}


private void LateUpdate ()
{
if (lookAtIK)
{
if (headTurnTarget)
{
lookAtIK.solver.IKPosition = headTurnTarget.position + offset;
}
lookAtIK.solver.IKPositionWeight = headWeight;
}
}

#endregion


#region PublicFunctions

public void SetLookAtTarget (Char character, Transform headTurnTarget, Vector3 offset, bool isInstant)
{
if (headTurnTarget != null && character == this.character)
{
this.headTurnTarget = headTurnTarget;
this.offset = offset;

if (isInstant)
{
headWeight = 1f;
headWeightLerp.Update (1f, 1f, headTurnSpeed);
}
}
}


public void ClearLookAtTarget (Char character, bool isInstant)
{
if (character == this.character)
{
headTurnTarget = null;

if (isInstant)
{
headWeight = 0f;
headWeightLerp.Update (0f, 0f, headTurnSpeed);
}
}
}


public void ClearLookAtTarget (Transform _headTurnTarget)
{
if (headTurnTarget == _headTurnTarget)
{
headTurnTarget = null;
}
}

#endregion

}