EditorTool3D/Assets/TriLib/TriLibSamples/AvatarLoader/Scripts/AvatarLoader.cs

82 lines
3.5 KiB
C#

#pragma warning disable 649
using TriLibCore.Extensions;
using TriLibCore.General;
using TriLibCore.Mappers;
using UnityEngine;
namespace TriLibCore.Samples
{
/// <summary>Represents a TriLib sample which allows the user to load and control a custom avatar.</summary>
public class AvatarLoader : AssetViewerBase
{
/// <summary>
/// Game object that is used to hide the model while it is loading.
/// </summary>
[SerializeField]
private GameObject _wrapper;
/// <summary>
/// Mapper to be used when loading the Avatar.
/// </summary>
[SerializeField]
private HumanoidAvatarMapper _humanoidAvatarMapper;
/// <summary>
/// Shows the file picker so the user can load an avatar from the local file system.
/// </summary>
public void LoadAvatarFromFile()
{
LoadModelFromFile(_wrapper);
}
/// <summary>Event triggered when the Model (including Textures and Materials) has been fully loaded.</summary>
/// <param name="assetLoaderContext">The Asset Loader Context reference. Asset Loader Context contains the Model loading data.</param>
protected override void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)
{
base.OnMaterialsLoad(assetLoaderContext);
if (assetLoaderContext.RootGameObject != null)
{
var existingInnerAvatar = AvatarController.Instance.InnerAvatar;
if (existingInnerAvatar != null)
{
Destroy(existingInnerAvatar);
}
var controller = AvatarController.Instance.Animator.runtimeAnimatorController;
var bounds = assetLoaderContext.RootGameObject.CalculateBounds();
var factor = AvatarController.Instance.CharacterController.height / bounds.size.y;
assetLoaderContext.RootGameObject.transform.localScale = factor * Vector3.one;
AvatarController.Instance.InnerAvatar = assetLoaderContext.RootGameObject;
assetLoaderContext.RootGameObject.transform.SetParent(AvatarController.Instance.transform, false);
AvatarController.Instance.Animator = assetLoaderContext.RootGameObject.GetComponent<Animator>();
AvatarController.Instance.Animator.runtimeAnimatorController = controller;
}
}
/// <summary>Configures the avatar loading and adjusts avatar size factor based on the existing avatar.</summary>
protected override void Start()
{
base.Start();
AssetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();
AssetLoaderOptions.AnimationType = AnimationType.Humanoid;
AssetLoaderOptions.HumanoidAvatarMapper = _humanoidAvatarMapper;
var bounds = AvatarController.Instance.InnerAvatar.CalculateBounds();
var factor = AvatarController.Instance.CharacterController.height / bounds.size.y;
AvatarController.Instance.InnerAvatar.transform.localScale = factor * Vector3.one;
}
/// <summary>
/// Handles the input.
/// </summary>
private void Update()
{
if (GetMouseButtonDown(1))
{
Cursor.lockState = Cursor.lockState == CursorLockMode.None ? CursorLockMode.Locked : CursorLockMode.None;
}
if (Cursor.lockState == CursorLockMode.Locked)
{
UpdateCamera();
}
}
}
}