Table of Contents
— Hilmi 2022/08/01 17:28
Introduction Animancer
Animancer?
Instead of we use build in unity animation manager, we use Animancer to animate directly using script, This is easier and faster!
Introduction Easy Character Movement
ECM?
By using ECM framework we can use their framework and tweak it as we wanted to
Scripts
MyCharacterController derived by BaseCharacterController, Here are where we adjust ECM code.
using ECM.Common; using ECM.Controllers; using UnityEngine; public sealed class MyCharacterController : BaseCharacterController { public Transform playerCamera; public float customSpeedWalk = 3f; public float customSpeedRun = 10f; public void makeWalk() { speed = customSpeedWalk; } public void makeRun() { speed = customSpeedRun; } protected override void HandleInput() { // Handle your custom input here... moveDirection = new UnityEngine.Vector3 { x = Input.GetAxisRaw("Horizontal"), y = 0.0f, z = Input.GetAxisRaw("Vertical") }; if(!isJumping) jump = Input.GetButton("Jump"); //walk = Input.GetButton("Fire3"); // Transform moveDirection vector to be relative to camera view direction moveDirection = moveDirection.relativeTo(playerCamera); } }
ExploreCameraController, we control our camera here.
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using Sirenix.OdinInspector; public class ExploreCameraController : MonoBehaviour { public Transform mainCamera; public float xVal = 0; private float turnSpeed = 4; private Vector3 offsetX; public float height = 15f; public float distance = 12f; public float lookAtSensitivity = 0.3f; public float rotateSensitivity = 0.3f; public float mouseSensitive = 5; public float turnSpeedSensitivity = 0.05f; void Awake() { offsetX = new Vector3(0, height, distance); transform.DOMove(new Vector3((mainCamera.position + offsetX).x, height, (mainCamera.position + offsetX).z), rotateSensitivity); } [Button] void updateHeightDistance() { offsetX = new Vector3(0, height, distance); } //public float zVal = 0; // Update is called once per frame void LateUpdate() { this.transform.DOLookAt(mainCamera.position, lookAtSensitivity); //this.transform.DOMove(new Vector3(mainCamera.position.x + xVal, this.transform.position.y, mainCamera.position.z + -xVal), 1f); if (Input.GetKey(KeyCode.Mouse0)) { offsetX = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * (turnSpeed * mouseSensitive), Vector3.up) * offsetX; } if (Input.GetKey(KeyCode.E)) { offsetX = Quaternion.AngleAxis(1 * (turnSpeed * turnSpeedSensitivity * Time.deltaTime), Vector3.up) * offsetX; } if (Input.GetKey(KeyCode.Q)) { offsetX = Quaternion.AngleAxis(-1 * (turnSpeed * turnSpeedSensitivity * Time.deltaTime), Vector3.up) * offsetX; } //transform.position = mainCamera.position + offsetX; transform.DOMove(new Vector3((mainCamera.position + offsetX).x, height, (mainCamera.position + offsetX).z), rotateSensitivity); } }
We use script to assign animation into our character.
using System.Collections; using System.Collections.Generic; using UnityEngine; using Animancer; using Animancer.Examples; using ECM.Controllers; public class CharacterAnimationController : MonoBehaviour { [SerializeField] private AnimancerComponent _Animancer; [SerializeField] private ClipTransition _Idle; [SerializeField] private ClipTransition _Move; [SerializeField] private ClipTransition _Run; [SerializeField] private ClipTransition _Action; private MyCharacterController myCharacterController; private void Start() { myCharacterController = FindObjectOfType<MyCharacterController>(); } private void Update() { if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D)) { _Animancer.Play(_Move); myCharacterController.makeWalk(); if (Input.GetKey(KeyCode.LeftShift)) { _Animancer.Play(_Run); myCharacterController.makeRun(); } } else { _Animancer.Play(_Idle); } } }