/// <summary> /// This is called every frame by AI in order to tell the character what its inputs are /// </summary> public void SetInputs(ref AICharacterInputs aiInputs) { // Move and look inputs MoveInputVector = aiInputs.MoveVector; if (MoveInputVector.sqrMagnitude == 0f) { LookInputVector = Motor.CharacterForward; } else { LookInputVector = Vector3.ProjectOnPlane(MoveInputVector, Motor.CharacterUp); } }
private void HandleCharacterNavigation() { AICharacterInputs aiCharacterInputs = new AICharacterInputs(); if ((character.transform.position - destination).magnitude <= 0.2f) { aiCharacterInputs.MoveVector = Vector3.zero; // Apply inputs to character character.SetInputs(ref aiCharacterInputs); return; } if (NavMesh.CalculatePath(character.transform.position, destination, NavMesh.AllAreas, _path)) { _lastValidDestination = destination; } else { NavMesh.CalculatePath(character.transform.position, _lastValidDestination, NavMesh.AllAreas, _path); } int cornersCount = _path.GetCornersNonAlloc(_pathCorners); //Calculate path corners if (cornersCount >= 1) { // Build the CharacterInputs struct aiCharacterInputs.MoveVector = (_pathCorners[1] - character.transform.position).normalized; // Apply inputs to character character.SetInputs(ref aiCharacterInputs); } else { // Build the CharacterInputs struct aiCharacterInputs.MoveVector = Vector3.zero; // Apply inputs to character character.SetInputs(ref aiCharacterInputs); } }