-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathThirdPersonCharacterBuilder.cs
More file actions
80 lines (67 loc) · 3.41 KB
/
ThirdPersonCharacterBuilder.cs
File metadata and controls
80 lines (67 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using Cinemachine;
using StarterAssets;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
public static class ThirdPersonCharacterBuilder
{
private const string ANIMATOR_PATH = "Assets/StarterAssets/ThirdPersonController/Character/Animations/StarterAssetsThirdPerson.controller";
private const string INPUT_ASSET_PATH = "Assets/StarterAssets/InputSystem/StarterAssets.inputactions";
private const string CAMERA_TARGET_OBJECT_NAME = "CameraTarget";
private const string LANDING_AUDIO_PATH = "Assets/StarterAssets/ThirdPersonController/Character/Sfx/Player_Land.wav";
private const string FOOTSTEP_AUDIO_PATH = "Assets/StarterAssets/ThirdPersonController/Character/Sfx/Player_Footstep";
[MenuItem("Ready Player Me/Setup Character", true, 0)]
public static bool SetupCharacterValidate()
{
return Selection.activeGameObject != null;
}
[MenuItem("Ready Player Me/Setup Character")]
public static void SetupCharacter()
{
// Cache selected object to add the components
GameObject character = Selection.activeGameObject;
character.tag = "Player";
// Create camera follow target
GameObject cameraTarget = new GameObject(CAMERA_TARGET_OBJECT_NAME);
cameraTarget.transform.parent = character.transform;
cameraTarget.transform.localPosition = new Vector3(0, 1.5f, 0);
cameraTarget.tag = "CinemachineTarget";
// Set the animator controller and disable root motion
Animator animator = character.GetComponent<Animator>();
animator.runtimeAnimatorController = AssetDatabase.LoadAssetAtPath<RuntimeAnimatorController>(ANIMATOR_PATH);
animator.applyRootMotion = false;
// Add tp controller and set values
ThirdPersonController tpsController = character.AddComponent<ThirdPersonController>();
tpsController.GroundedOffset = 0.1f;
tpsController.GroundLayers = 1;
tpsController.JumpTimeout = 0.5f;
tpsController.CinemachineCameraTarget = cameraTarget;
tpsController.LandingAudioClip = AssetDatabase.LoadAssetAtPath<AudioClip>(LANDING_AUDIO_PATH);
tpsController.FootstepAudioClips = new AudioClip[]
{
AssetDatabase.LoadAssetAtPath<AudioClip>($"{FOOTSTEP_AUDIO_PATH}_01.wav"),
AssetDatabase.LoadAssetAtPath<AudioClip>($"{FOOTSTEP_AUDIO_PATH}_02.wav")
};
// Add character controller and set size
CharacterController characterController = character.GetComponent<CharacterController>();
characterController.center = new Vector3(0, 1, 0);
characterController.radius = 0.3f;
characterController.height = 1.9f;
// Add components with default values
character.AddComponent<BasicRigidBodyPush>();
character.AddComponent<StarterAssetsInputs>();
// Add player input and set actions asset
PlayerInput playerInput = character.GetComponent<PlayerInput>();
playerInput.actions = AssetDatabase.LoadAssetAtPath<InputActionAsset>(INPUT_ASSET_PATH);
EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());
//
var camera = Object.FindObjectOfType<CinemachineVirtualCamera>();
if (camera)
{
camera.Follow = cameraTarget.transform;
camera.LookAt = cameraTarget.transform;
}
}
}