This is an old revision of the document!
Player Prototyping
NPC Prototyping
ZombieNpcMovingController Script
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using Micosmo.SensorToolkit; using Sirenix.OdinInspector; public class ZombieNpcMovingController : MonoBehaviour { public List<Transform> checkPoint; private int checkPointIndex = 0; private CharacterController _characterController; private ZombieAnimationController _zombieAnimationController; [BoxGroup("Movement Tweak")] [SerializeField] private float _walkSpeed = 1; [BoxGroup("Movement Tweak")] [SerializeField] private float _runSpeed = 3; private ISteeringSensor _steering; private SteeringSensor _steeringSensor; private void Start() { Initialization(); _steeringSensor.Locomotion.MaxForwardSpeed = _walkSpeed; } private void Initialization() { _steering = GetComponentInChildren<ISteeringSensor>(); _steeringSensor = GetComponentInChildren<SteeringSensor>(); _characterController = GetComponent<CharacterController>(); _zombieAnimationController = GetComponent<ZombieAnimationController>(); } void Update() { MoveToCheckPoint(); } private void MoveToCheckPoint() { if (_steering.IsDestinationReached) { int index = checkPointIndex == checkPoint.Count - 1 ? checkPointIndex = 0 : checkPointIndex += 1; _steering.Seek.DestinationTransform = checkPoint[index]; } } [Button] public void MakeCharacterWalk() { _steeringSensor.Locomotion.MaxForwardSpeed = _walkSpeed; } [Button] public void MakeCharacterRunning() { _steeringSensor.Locomotion.MaxForwardSpeed = _runSpeed; } [Button] public void MakeCharacterPunch() { _zombieAnimationController.PlayAction(_zombieAnimationController.attack); } }
ZombieAnimationController Script
using Animancer; using Sirenix.OdinInspector; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class ZombieAnimationController : MonoBehaviour { private AnimancerComponent _Animancer; [SerializeField] public ClipTransition idle; [SerializeField] public ClipTransition moveFoward; [SerializeField] public ClipTransition runFoward; [SerializeField] public ClipTransition attack; [SerializeField] private AvatarMask _baseBody; [SerializeField] private AvatarMask _upperBody; private AnimancerLayer _baseLayer; private AnimancerLayer _upperBodyLayer; //private CharacterController _characterController; private NavMeshAgent _navMeshAgent; private void Awake() { Initialization(); InitializationAnim(); } private void Initialization() { //_characterController = GetComponent<CharacterController>(); _navMeshAgent = GetComponent<NavMeshAgent>(); _Animancer = GetComponentInChildren<AnimancerComponent>(); } private void InitializationAnim() { _baseLayer = _Animancer.Layers[0]; _upperBodyLayer = _Animancer.Layers[1]; _baseLayer.SetMask(_baseBody); _upperBodyLayer.SetMask(_upperBody); attack.Events.OnEnd = OnActionEnd; } private void Update() { //if(_characterController.velocity.magnitude > 1f) if (_navMeshAgent.velocity.magnitude > 1f) { _baseLayer.Play(moveFoward, 1f); } //if (_characterController.velocity.magnitude > 2f) if(_navMeshAgent.velocity.magnitude > 2f) { _baseLayer.Play(runFoward, 1f); } } bool _canBePlayed = true; public void PlayAction(ClipTransition clip) { if (!_canBePlayed) return; _upperBodyLayer.Play(clip); StartCoroutine(PlayActionDelay(clip.Clip.length)); } private IEnumerator PlayActionDelay(float length) { _canBePlayed = false; yield return new WaitForSeconds(length); _canBePlayed = true; } private void OnActionEnd() { _upperBodyLayer.StartFade(0, 1f); } }
