移除ECM2

This commit is contained in:
2025-05-11 21:42:51 +08:00
parent aadd564c38
commit a7bf033ca9
726 changed files with 0 additions and 138648 deletions

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ec572efc033bf4d4981ad6f0826644a6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 885247a2d1515d845a67d8ac710ebd50
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 01a66eee63ba18d448eba9b1f3b2b6d5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 62e04b9d2fdce1d48a58d6f32dbe9d94
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: f8ae32dc088988e4a8c1bc3aa94e1980
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 1b54570a11beb04408cb0b800a30e3d4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,103 +0,0 @@
using UnityEngine;
using UnityEngine.InputSystem;
namespace ECM2.Walkthrough.Ex23
{
/// <summary>
/// This example shows how to make use of the new Input System,
/// in particular, the PlayerInput component to control a Character.
///
/// These handlers are updated and managed by the PlayerInput component.
/// </summary>
public class CharacterInput : MonoBehaviour
{
/// <summary>
/// Our controlled character.
/// </summary>
[Tooltip("Character to be controlled.\n" +
"If not assigned, this will look into this GameObject.")]
[SerializeField]
private Character _character;
/// <summary>
/// Current movement input values.
/// </summary>
private Vector2 _movementInput;
/// <summary>
/// Movement InputAction event handler.
/// </summary>
public void OnMove(InputAction.CallbackContext context)
{
_movementInput = context.ReadValue<Vector2>();
}
/// <summary>
/// Jump InputAction event handler.
/// </summary>
public void OnJump(InputAction.CallbackContext context)
{
if (context.started)
_character.Jump();
else if (context.canceled)
_character.StopJumping();
}
/// <summary>
/// Crouch InputAction event handler.
/// </summary>
public void OnCrouch(InputAction.CallbackContext context)
{
if (context.started)
_character.Crouch();
else if (context.canceled)
_character.UnCrouch();
}
/// <summary>
/// Handle polled input here (ie: movement, look, etc.)
/// </summary>
protected virtual void HandleInput()
{
// Compose a movement direction vector in world space
Vector3 movementDirection = Vector3.zero;
movementDirection += Vector3.forward * _movementInput.y;
movementDirection += Vector3.right * _movementInput.x;
// If character has a camera assigned,
// make movement direction relative to this camera view direction
if (_character.cameraTransform)
{
movementDirection
= movementDirection.relativeTo(_character.cameraTransform, _character.GetUpVector());
}
// Set character's movement direction vector
_character.SetMovementDirection(movementDirection);
}
protected virtual void Awake()
{
// If character not assigned, attempts to cache from this current GameObject
if (_character == null)
_character = GetComponent<Character>();
}
protected virtual void Update()
{
HandleInput();
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 855c880aafd786e469e74d8dcc0f4fc8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5a485e6ba4ca328418198154c3c5b8a9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 051ffeb8996dad2478867b59b30b8149
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ffee0df8c7b39c14aaf448ac6f058315
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,133 +0,0 @@
using ECM2.Examples.FirstPerson;
using UnityEngine;
using UnityEngine.InputSystem;
namespace ECM2.Walkthrough.Ex24
{
/// <summary>
/// This example shows how to make use of the new Input System,
/// in particular, the PlayerInput component to control a First Person Character.
///
/// These handlers are updated and managed by the PlayerInput component.
/// </summary>
public class FirstPersonInput : MonoBehaviour
{
/// <summary>
/// Our controlled character.
/// </summary>
[Tooltip("Character to be controlled.\n" +
"If not assigned, this will look into this GameObject.")]
[SerializeField]
private FirstPersonCharacter _character;
[Space(15.0f)]
public bool invertLook = true;
[Tooltip("Mouse look sensitivity")]
public Vector2 sensitivity = new Vector2(0.05f, 0.05f);
[Space(15.0f)]
[Tooltip("How far in degrees can you move the camera down.")]
public float minPitch = -80.0f;
[Tooltip("How far in degrees can you move the camera up.")]
public float maxPitch = 80.0f;
/// <summary>
/// Current movement input values.
/// </summary>
private Vector2 _movementInput;
/// <summary>
/// Current look input values.
/// </summary>
private Vector2 _lookInput;
/// <summary>
/// Movement InputAction event handler.
/// </summary>
public void OnMove(InputAction.CallbackContext context)
{
_movementInput = context.ReadValue<Vector2>();
}
/// <summary>
/// Look InputAction event handler.
/// </summary>
public void OnLook(InputAction.CallbackContext context)
{
_lookInput = context.ReadValue<Vector2>();
}
/// <summary>
/// Jump InputAction event handler.
/// </summary>
public void OnJump(InputAction.CallbackContext context)
{
if (context.started)
_character.Jump();
else if (context.canceled)
_character.StopJumping();
}
/// <summary>
/// Crouch InputAction event handler.
/// </summary>
public void OnCrouch(InputAction.CallbackContext context)
{
if (context.started)
_character.Crouch();
else if (context.canceled)
_character.UnCrouch();
}
/// <summary>
/// Handle polled input here (ie: movement, look, etc.)
/// </summary>
protected virtual void HandleInput()
{
// Move
Vector3 movementDirection = Vector3.zero;
movementDirection += Vector3.forward * _movementInput.y;
movementDirection += Vector3.right * _movementInput.x;
movementDirection = movementDirection.relativeTo(_character.cameraTransform, _character.GetUpVector());
_character.SetMovementDirection(movementDirection);
// Look
Vector2 lookInput = _lookInput * sensitivity;
_character.AddControlYawInput(lookInput.x);
_character.AddControlPitchInput(invertLook ? -lookInput.y : lookInput.y, minPitch, maxPitch);
}
protected virtual void Awake()
{
// If character not assigned, attempts to cache from this current GameObject
if (_character == null)
_character = GetComponent<FirstPersonCharacter>();
}
protected virtual void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
protected virtual void Update()
{
HandleInput();
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8ed2487effc9e92479c5b2bb14904e09
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e69e7a765c2d6ab449adca049fb66006
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 7f6506b82daa82348be14fb6c81c641a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 36e521298f3f4884caf7d4e3cca0e81e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,156 +0,0 @@
using ECM2.Examples.ThirdPerson;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
namespace ECM2.Walkthrough.Ex25
{
/// <summary>
/// This example shows how to make use of the new Input System,
/// in particular, the PlayerInput component to control a Third Person Character.
///
/// These handlers are updated and managed by the PlayerInput component.
/// </summary>
///
public class ThirdPersonInput : MonoBehaviour
{
[Tooltip("Character to be controlled.\n" +
"If not assigned, this will look into this GameObject.")]
[SerializeField]
private ThirdPersonCharacter _character;
[Space(15.0f)]
public bool invertLook = true;
[FormerlySerializedAs("sensitivity")] [Tooltip("Look sensitivity")]
public Vector2 lookSensitivity = new Vector2(0.05f, 0.05f);
[Tooltip("Zoom Sensitivity")]
public float zoomSensitivity = 1.0f;
[Space(15.0f)]
[Tooltip("How far in degrees can you move the camera down.")]
public float minPitch = -80.0f;
[Tooltip("How far in degrees can you move the camera up.")]
public float maxPitch = 80.0f;
/// <summary>
/// Current movement input values.
/// </summary>
private Vector2 _movementInput;
/// <summary>
/// Current look input values.
/// </summary>
private Vector2 _lookInput;
/// <summary>
/// Current look input values.
/// </summary>
private Vector2 _zoomInput;
/// <summary>
/// Movement InputAction event handler.
/// </summary>
public void OnMove(InputAction.CallbackContext context)
{
_movementInput = context.ReadValue<Vector2>();
}
/// <summary>
/// Look InputAction event handler.
/// </summary>
public void OnLook(InputAction.CallbackContext context)
{
_lookInput = context.ReadValue<Vector2>();
}
/// <summary>
/// Zoom InputAction event handler.
/// </summary>
public void OnZoom(InputAction.CallbackContext context)
{
_zoomInput = context.ReadValue<Vector2>();
}
/// <summary>
/// Jump InputAction event handler.
/// </summary>
public void OnJump(InputAction.CallbackContext context)
{
if (context.started)
_character.Jump();
else if (context.canceled)
_character.StopJumping();
}
/// <summary>
/// Crouch InputAction event handler.
/// </summary>
public void OnCrouch(InputAction.CallbackContext context)
{
if (context.started)
_character.Crouch();
else if (context.canceled)
_character.UnCrouch();
}
/// <summary>
/// Handle polled input here (ie: movement, look, etc.)
/// </summary>
protected virtual void HandleInput()
{
// Move
Vector3 movementDirection = Vector3.zero;
movementDirection += Vector3.right * _movementInput.x;
movementDirection += Vector3.forward * _movementInput.y;
if (_character.cameraTransform)
movementDirection = movementDirection.relativeTo(_character.cameraTransform, _character.GetUpVector());
_character.SetMovementDirection(movementDirection);
// Look
Vector2 lookInput = _lookInput * lookSensitivity;
_character.AddControlYawInput(lookInput.x);
_character.AddControlPitchInput(invertLook ? -lookInput.y : lookInput.y, minPitch, maxPitch);
// Zoom
Vector2 zoomInput = _zoomInput * zoomSensitivity;
_character.AddControlZoomInput(zoomInput.y);
}
protected virtual void Awake()
{
// If character not assigned, attempts to cache from this current GameObject
if (_character == null)
_character = GetComponent<ThirdPersonCharacter>();
}
protected virtual void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
protected virtual void Update()
{
HandleInput();
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 6baa13809475a0b4e8c754503a48fcd6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 3a07d0194ce491a4481b2bc6e4adcddf
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 26e3edf69cc50474888179da47b38ab3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: df5e43a2b20112544875caa4d72e1b22
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 218dc7872e014a538fe2f1f1b732e706
timeCreated: 1700123862

View File

@@ -1,70 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex31
{
/// <summary>
/// This example shows how to animate a Character,
/// using the Character data (movement direction, velocity, is jumping, etc) to feed your Animator.
/// </summary>
public class AnimationController : MonoBehaviour
{
// Cache Animator parameters
private static readonly int Forward = Animator.StringToHash("Forward");
private static readonly int Turn = Animator.StringToHash("Turn");
private static readonly int Ground = Animator.StringToHash("OnGround");
private static readonly int Crouch = Animator.StringToHash("Crouch");
private static readonly int Jump = Animator.StringToHash("Jump");
private static readonly int JumpLeg = Animator.StringToHash("JumpLeg");
// Cached Character
private Character _character;
private void Awake()
{
// Cache our Character
_character = GetComponentInParent<Character>();
}
private void Update()
{
float deltaTime = Time.deltaTime;
// Get Character animator
Animator animator = _character.GetAnimator();
// Compute input move vector in local space
Vector3 move = transform.InverseTransformDirection(_character.GetMovementDirection());
// Update the animator parameters
float forwardAmount = _character.useRootMotion && _character.GetRootMotionController()
? move.z
: Mathf.InverseLerp(0.0f, _character.GetMaxSpeed(), _character.GetSpeed());
animator.SetFloat(Forward, forwardAmount, 0.1f, deltaTime);
animator.SetFloat(Turn, Mathf.Atan2(move.x, move.z), 0.1f, deltaTime);
animator.SetBool(Ground, _character.IsGrounded());
animator.SetBool(Crouch, _character.IsCrouched());
if (_character.IsFalling())
animator.SetFloat(Jump, _character.GetVelocity().y, 0.1f, deltaTime);
// Calculate which leg is behind, so as to leave that leg trailing in the jump animation
// (This code is reliant on the specific run cycle offset in our animations,
// and assumes one leg passes the other at the normalized clip times of 0.0 and 0.5)
float runCycle = Mathf.Repeat(animator.GetCurrentAnimatorStateInfo(0).normalizedTime + 0.2f, 1.0f);
float jumpLeg = (runCycle < 0.5f ? 1.0f : -1.0f) * forwardAmount;
if (_character.IsGrounded())
animator.SetFloat(JumpLeg, jumpLeg);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 637965ac47304625a97a4eb85d5b98af
timeCreated: 1700123873

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a975b64a803cefa47aaa4a3c1b8e9225
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 4f612ffbed25c174c8516cd491a87438
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a63ee7994c49a1e4e82074f9fb5cb6a0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: f87749751c4088647acafff6304c760d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 89d104878c1437246b197fe4a829808d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,40 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex33
{
/// <summary>
/// This example shows how to extend a Character (through composition) to enable / disable (toggle)
/// root motion as needed; in this case, enabled when walking.
/// </summary>
public class RootMotionToggle : MonoBehaviour
{
private Character _character;
private void OnMovementModeChanged(Character.MovementMode prevMovementMode, int prevCustomMovementMode)
{
// Allow root motion only while walking
_character.useRootMotion = _character.IsWalking();
}
private void Awake()
{
_character = GetComponent<Character>();
}
private void OnEnable()
{
// Subscribe to Character events
_character.MovementModeChanged += OnMovementModeChanged;
}
private void OnDisable()
{
// Un-Subscribe from Character events
_character.MovementModeChanged -= OnMovementModeChanged;
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 0dff82c65b2d69948bcee99cdd3a44da
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c1896083ffaf5244b84ca31c6f727c7c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 0da0459c0549421aa847206c393566c6
timeCreated: 1700110443

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 04bd0a6d231620948b6e1f8642516c2d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 9a760961c1fb48c9a63d8126fd4299a1
timeCreated: 1700174902

View File

@@ -1,90 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex41
{
/// <summary>
/// This example shows how to extend a Character (through inheritance) to perform a sprint ability.
/// This uses one of the new methods (introduced in v1.4) OnBeforeSimulationUpdate,
/// to easily modify the character's state within Character's simulation loop.
/// </summary>
public class SprintableCharacter : Character
{
[Space(15.0f)]
public float maxSprintSpeed = 10.0f;
private bool _isSprinting;
private bool _sprintInputPressed;
/// <summary>
/// Request the character to start to sprint.
/// </summary>
public void Sprint()
{
_sprintInputPressed = true;
}
/// <summary>
/// Request the character to stop sprinting.
/// </summary>
public void StopSprinting()
{
_sprintInputPressed = false;
}
public bool IsSprinting()
{
return _isSprinting;
}
/// <summary>
/// Determines if the character is able to sprint in its current state.
/// </summary>
private bool CanSprint()
{
// A character can only sprint if:
// A character is in its walking movement mode and not crouched
return IsWalking() && !IsCrouched();
}
/// <summary>
/// Start / stops a requested sprint.
/// </summary>
private void CheckSprintInput()
{
if (!_isSprinting && _sprintInputPressed && CanSprint())
{
_isSprinting = true;
}
else if (_isSprinting && (!_sprintInputPressed || !CanSprint()))
{
_isSprinting = false;
}
}
/// <summary>
/// Override GetMaxSpeed method to return maxSprintSpeed while sprinting.
/// </summary>
public override float GetMaxSpeed()
{
return _isSprinting ? maxSprintSpeed : base.GetMaxSpeed();
}
protected override void OnBeforeSimulationUpdate(float deltaTime)
{
// Call base method implementation
base.OnBeforeSimulationUpdate(deltaTime);
// Handle sprint
CheckSprintInput();
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 0d88021f925b47469d907d1488264b49
timeCreated: 1700110471

View File

@@ -1,69 +0,0 @@
using ECM2.Examples;
using UnityEngine.InputSystem;
namespace ECM2.Walkthrough.Ex41
{
/// <summary>
/// Extends CharacterInput adding support for Sprint InputAction.
/// </summary>
public class SprintableCharacterInput : CharacterInput
{
private SprintableCharacter _sprintableCharacter;
/// <summary>
/// Sprint InputAction.
/// </summary>
public InputAction sprintInputAction { get; set; }
/// <summary>
/// Sprint InputAction handler.
/// </summary>
public virtual void OnSprint(InputAction.CallbackContext context)
{
if (context.started)
_sprintableCharacter.Sprint();
else if (context.canceled)
_sprintableCharacter.StopSprinting();
}
protected override void InitPlayerInput()
{
base.InitPlayerInput();
// Setup Sprint input action handlers
sprintInputAction = inputActionsAsset.FindAction("Sprint");
if (sprintInputAction != null)
{
sprintInputAction.started += OnSprint;
sprintInputAction.canceled += OnSprint;
sprintInputAction.Enable();
}
}
protected override void DeinitPlayerInput()
{
base.DeinitPlayerInput();
if (sprintInputAction != null)
{
sprintInputAction.started -= OnSprint;
sprintInputAction.canceled -= OnSprint;
sprintInputAction.Disable();
sprintInputAction = null;
}
}
protected override void Awake()
{
base.Awake();
_sprintableCharacter = character as SprintableCharacter;
}
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: aae1b8010de5d4a4ea1f944d9fe09bcc

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 5af609ff5be14b28b526cb974a6662fa
timeCreated: 1700115834

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 4c37c58624030d74a9972d4a9d21fa15
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 3deb2cb5bf2b15b4297ac3a7369fb3bb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,109 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex42
{
/// <summary>
/// This example shows how to extend a Character (through composition) to perform a sprint ability.
/// This one use the new simulation OnBeforeSimulationUpdate event (introduced in v1.4),
/// to easily modify the character's state within Character's simulation loop.
/// </summary>
public class SprintAbility : MonoBehaviour
{
[Space(15.0f)]
public float maxSprintSpeed = 10.0f;
private Character _character;
private bool _isSprinting;
private bool _sprintInputPressed;
private float _cachedMaxWalkSpeed;
/// <summary>
/// Request the character to start to sprint.
/// </summary>
public void Sprint()
{
_sprintInputPressed = true;
}
/// <summary>
/// Request the character to stop sprinting.
/// </summary>
public void StopSprinting()
{
_sprintInputPressed = false;
}
/// <summary>
/// Return true if the character is sprinting, false otherwise.
/// </summary>
public bool IsSprinting()
{
return _isSprinting;
}
/// <summary>
/// Determines if the character, is able to sprint in its current state.
/// </summary>
private bool CanSprint()
{
return _character.IsWalking() && !_character.IsCrouched();
}
/// <summary>
/// Handles sprint input and adjusts character speed accordingly.
/// </summary>
private void CheckSprintInput()
{
if (!_isSprinting && _sprintInputPressed && CanSprint())
{
_isSprinting = true;
_cachedMaxWalkSpeed = _character.maxWalkSpeed;
_character.maxWalkSpeed = maxSprintSpeed;
}
else if (_isSprinting && (!_sprintInputPressed || !CanSprint()))
{
_isSprinting = false;
_character.maxWalkSpeed = _cachedMaxWalkSpeed;
}
}
private void OnBeforeSimulationUpdated(float deltaTime)
{
// Handle sprinting
CheckSprintInput();
}
private void Awake()
{
// Cache character
_character = GetComponent<Character>();
}
private void OnEnable()
{
// Subscribe to Character BeforeSimulationUpdated event
_character.BeforeSimulationUpdated += OnBeforeSimulationUpdated;
}
private void OnDisable()
{
// Un-Subscribe from Character BeforeSimulationUpdated event
_character.BeforeSimulationUpdated -= OnBeforeSimulationUpdated;
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: ea4bc13934a49484bb0606e7a1ff4f76
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,76 +0,0 @@
using ECM2.Examples;
using UnityEngine.InputSystem;
namespace ECM2.Walkthrough.Ex42
{
/// <summary>
/// Extends CharacterInput adding support to handle the Sprint Ability.
/// </summary>
public class SprintAbilityInput : CharacterInput
{
// The Sprint Ability
private SprintAbility _sprintAbility;
/// <summary>
/// Sprint InputAction.
/// </summary>
public InputAction sprintInputAction { get; set; }
/// <summary>
/// Sprint InputAction handler.
/// </summary>
public virtual void OnSprint(InputAction.CallbackContext context)
{
if (context.started)
_sprintAbility.Sprint();
else if (context.canceled)
_sprintAbility.StopSprinting();
}
protected override void InitPlayerInput()
{
base.InitPlayerInput();
// Setup Sprint input action handlers
sprintInputAction = inputActionsAsset.FindAction("Sprint");
if (sprintInputAction != null)
{
sprintInputAction.started += OnSprint;
sprintInputAction.canceled += OnSprint;
sprintInputAction.Enable();
}
}
protected override void DeinitPlayerInput()
{
base.DeinitPlayerInput();
if (sprintInputAction != null)
{
sprintInputAction.started -= OnSprint;
sprintInputAction.canceled -= OnSprint;
sprintInputAction.Disable();
sprintInputAction = null;
}
}
protected override void Awake()
{
// Call base method implementation (a MUST)
base.Awake();
// Cache character sprint ability component
_sprintAbility = GetComponent<SprintAbility>();
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 4213399d96084b888c737cbc95143458
timeCreated: 1700116698

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 6d26fb9929014f51915cce2a9f023be5
timeCreated: 1700267762

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 357780a279e73d64f9b373214e2dcd3c
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 92438bd78d11492aac3ba50f0a94bb22
timeCreated: 1700267822

View File

@@ -1,192 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex43
{
/// <summary>
/// This example shows how to extend a Character (through inheritance) adding a custom movement mode;
/// in this case, a Dash mechanic.
/// </summary>
public class DashingCharacter : Character
{
#region ENUMS
public enum ECustomMovementMode
{
None,
Dashing
}
#endregion
#region EDITOR EXPOSED FIELDS
[Space(15.0f)]
[Tooltip("Is the character able to Dash?")]
public bool canEverDash = true;
[Tooltip("Dash initial impulse.")]
public float dashImpulse = 20.0f;
[Tooltip("Dash duration in seconds.")]
public float dashDuration = 0.15f;
#endregion
#region FIELDS
protected float _dashingTime;
protected bool _dashInputPressed;
#endregion
#region PROPERTIES
/// <summary>
/// Ture if dash input is pressed, false otherwise.
/// </summary>
protected bool dashInputPressed => _dashInputPressed;
#endregion
#region METHODS
/// <summary>
/// Is the character currently dashing?
/// </summary>
public bool IsDashing()
{
return movementMode == MovementMode.Custom && customMovementMode == (int)ECustomMovementMode.Dashing;
}
/// <summary>
/// Request to perform a dash.
/// The request is processed on the next simulation update.
/// Call this from an input event (such as a button 'down' event).
/// </summary>
public void Dash()
{
_dashInputPressed = true;
}
/// <summary>
/// Request to stop dashing.
/// The request is processed on the next simulation update.
/// Call this from an input event (such as a button 'up' event).
/// </summary>
public void StopDashing()
{
_dashInputPressed = false;
}
/// <summary>
/// Determines if the Character is able to dash in its current state.
/// Defaults to Walking or Falling while NOT crouched.
/// </summary>
public bool IsDashAllowed()
{
if (IsCrouched())
return false;
return canEverDash && (IsWalking() || IsFalling());
}
/// <summary>
/// Perform dash.
/// </summary>
protected virtual void DoDash()
{
// Apply dash impulse along input direction (if any) or along character's forward
Vector3 dashDirection = GetMovementDirection();
if (dashDirection.isZero())
dashDirection = GetForwardVector();
Vector3 dashDirection2D = dashDirection.onlyXZ().normalized;
SetVelocity(dashDirection2D * dashImpulse);
// Change to dashing movement mode
SetMovementMode(MovementMode.Custom, (int)ECustomMovementMode.Dashing);
// Lock rotation towards dashing direction
if (rotationMode == RotationMode.OrientRotationToMovement)
SetRotation(Quaternion.LookRotation(dashDirection2D));
}
/// <summary>
/// Reset dashing state and exit dashing movement mode.
/// </summary>
protected virtual void ResetDashState()
{
// Reset dashing state
_dashingTime = 0.0f;
_dashInputPressed = false;
// Clear dashing impulse
SetVelocity(Vector3.zero);
// Falling is auto-manged state so its safe to use as an exit state.
SetMovementMode(MovementMode.Falling);
}
/// <summary>
/// Update dashing movement mode.
/// </summary>
protected virtual void DashingMovementMode(float deltaTime)
{
// This prevents the character from rotate towards a movement direction
SetMovementDirection(Vector3.zero);
// Update dash timer...
_dashingTime += deltaTime;
if (_dashingTime >= dashDuration)
{
// If completed, exit dash state
ResetDashState();
}
}
protected override void OnBeforeSimulationUpdate(float deltaTime)
{
// Call base method implementation
base.OnBeforeSimulationUpdate(deltaTime);
// Attempts to start a requested dash
if (!IsDashing() && dashInputPressed && IsDashAllowed())
DoDash();
}
protected override void CustomMovementMode(float deltaTime)
{
// Call base method implementation
base.CustomMovementMode(deltaTime);
// Update dashing movement mode
if (customMovementMode == (int)ECustomMovementMode.Dashing)
DashingMovementMode(deltaTime);
}
#endregion
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: fab4444b2b79402da8541e78d971cd89
timeCreated: 1700267844

View File

@@ -1,73 +0,0 @@
using ECM2.Examples;
using UnityEngine.InputSystem;
namespace ECM2.Walkthrough.Ex43
{
/// <summary>
/// Extends CharacterInput adding support to handle Dash mechanic.
/// </summary>
public class DashingCharacterInput : CharacterInput
{
private DashingCharacter _dashingCharacter;
/// <summary>
/// Dash InputAction.
/// </summary>
public InputAction dashInputAction { get; set; }
/// <summary>
/// Sprint InputAction handler.
/// </summary>
public virtual void OnDash(InputAction.CallbackContext context)
{
if (context.started)
_dashingCharacter.Dash();
else if (context.canceled)
_dashingCharacter.StopDashing();
}
protected override void InitPlayerInput()
{
base.InitPlayerInput();
// Setup Sprint input action handlers
dashInputAction = inputActionsAsset.FindAction("Interact");
if (dashInputAction != null)
{
dashInputAction.started += OnDash;
dashInputAction.canceled += OnDash;
dashInputAction.Enable();
}
}
protected override void DeinitPlayerInput()
{
base.DeinitPlayerInput();
if (dashInputAction != null)
{
dashInputAction.started -= OnDash;
dashInputAction.canceled -= OnDash;
dashInputAction.Disable();
dashInputAction = null;
}
}
protected override void Awake()
{
// Call base method implementation (a MUST)
base.Awake();
// Cache DashingCharacter
_dashingCharacter = character as DashingCharacter;
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 870821bf5541ca240b0f6eebcb635f97
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b0b19c6f0802fc749a37232c6360f455
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 68a3136a575f419d888319ec1ee3a977
timeCreated: 1700173831

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 5ef935f2443c3ae4687c7cc025999221
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 865279845a5817441a4330415e7e2bad
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,92 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex51
{
/// <summary>
/// This example shows how to handle Character events when extending a Character through inheritance.
/// </summary>
public class PlayerCharacter : Character
{
protected override void OnCollided(ref CollisionResult collisionResult)
{
// Call base method implementation
base.OnCollided(ref collisionResult);
// Add your code here...
Debug.Log($"Collided with {collisionResult.collider.name}");
}
protected override void OnFoundGround(ref FindGroundResult foundGround)
{
// Call base method implementation
base.OnFoundGround(ref foundGround);
// Add your code here...
Debug.Log($"Found {foundGround.collider.name} ground");
}
protected override void OnLanded(Vector3 landingVelocity)
{
// Call base method implementation
base.OnLanded(landingVelocity);
// Add your code here...
Debug.Log($"Landed with {landingVelocity:F4} landing velocity.");
}
protected override void OnCrouched()
{
// Call base method implementation
base.OnCrouched();
// Add your code here...
Debug.Log("Crouched");
}
protected override void OnUnCrouched()
{
// Call base method implementation
base.OnUnCrouched();
// Add your code here...
Debug.Log("UnCrouched");
}
protected override void OnJumped()
{
// Call base method implementation
base.OnJumped();
// Add your code here...
Debug.Log("Jumped!");
// Enable apex notification event
notifyJumpApex = true;
}
protected override void OnReachedJumpApex()
{
// Call base method implementation
base.OnReachedJumpApex();
// Add your code here...
Debug.Log($"Apex reached {GetVelocity():F4}");
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: c8d7237bdbeb48bb8206383a09c25b67
timeCreated: 1700173847

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: b678c156abb8426bbdf3d7ed245e0c4c
timeCreated: 1700175120

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: d8cf67ee3bd62b14f9d080638c0d5d70
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: badc34f9953d46e7adb11e016d6354a8
timeCreated: 1700175243

View File

@@ -1,89 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex52
{
/// <summary>
/// This example shows how to listen to Character events when extending a Character through composition.
/// </summary>
public class PlayerController : MonoBehaviour
{
// Our controlled Character
[SerializeField]
private Character _character;
protected void OnCollided(ref CollisionResult collisionResult)
{
Debug.Log($"Collided with {collisionResult.collider.name}");
}
protected void OnFoundGround(ref FindGroundResult foundGround)
{
Debug.Log($"Found {foundGround.collider.name} ground");
}
protected void OnLanded(Vector3 landingVelocity)
{
Debug.Log($"Landed with {landingVelocity:F4} landing velocity.");
}
protected void OnCrouched()
{
Debug.Log("Crouched");
}
protected void OnUnCrouched()
{
Debug.Log("UnCrouched");
}
protected void OnJumped()
{
Debug.Log("Jumped!");
// Enable apex notification event
_character.notifyJumpApex = true;
}
protected void OnReachedJumpApex()
{
Debug.Log($"Apex reached {_character.GetVelocity():F4}");
}
private void Awake()
{
// If Character is not assigned, look into this GameObject
if (_character == null)
_character = GetComponent<Character>();
}
private void OnEnable()
{
// Subscribe to Character events
_character.Collided += OnCollided;
_character.FoundGround += OnFoundGround;
_character.Landed += OnLanded;
_character.Crouched += OnCrouched;
_character.UnCrouched += OnUnCrouched;
_character.Jumped += OnJumped;
_character.ReachedJumpApex += OnReachedJumpApex;
}
private void OnDisable()
{
// Un-subscribe from Character events
_character.Collided -= OnCollided;
_character.FoundGround -= OnFoundGround;
_character.Landed -= OnLanded;
_character.Crouched -= OnCrouched;
_character.UnCrouched -= OnUnCrouched;
_character.Jumped -= OnJumped;
_character.ReachedJumpApex -= OnReachedJumpApex;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 4e2bc2d1320241eb8fae230508f17ce1
timeCreated: 1700175269

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 38f551d1ced263f4c9cc9e3b851e8af8
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5c6227c91940406409f9456a4497e746
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: aea89ac7ee934a84fa5e17eb9a6af80d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 9c2b05f6db2b0334794284ad9654d3d2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,28 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex61
{
/// <summary>
/// This example shows how to implement a directional bouncer using the Character's LaunchCharacter function.
/// </summary>
public class Bouncer : MonoBehaviour
{
public float launchImpulse = 15.0f;
public bool overrideVerticalVelocity;
public bool overrideLateralVelocity;
private void OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Player"))
return;
if (!other.TryGetComponent(out Character character))
return;
character.PauseGroundConstraint();
character.LaunchCharacter(transform.up * launchImpulse, overrideVerticalVelocity, overrideLateralVelocity);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: e2f424a060a55e54fa1e050bdce93433
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,41 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex61
{
/// <summary>
/// This example shows how to simulate a directional wind using the Character's AddForce method.
/// </summary>
public class ForceZone : MonoBehaviour
{
public Vector3 windDirection = Vector3.up;
public float windStrength = 20.0f;
private void OnTriggerStay(Collider other)
{
if (!other.CompareTag("Player"))
return;
if (!other.TryGetComponent(out Character character))
return;
Vector3 windForce = windDirection.normalized * windStrength;
// Check to see if applied momentum is enough to overcome gravity,
// if does, pause ground constraint to allow the character leave the ground
Vector3 worldUp = -character.GetGravityDirection();
float upWindForceMagnitude = Vector3.Dot(windForce, worldUp);
if (upWindForceMagnitude > 0.0f)
{
if (character.IsWalking() && upWindForceMagnitude - character.GetGravityMagnitude() > 0.0f)
character.PauseGroundConstraint();
}
// Add force ignoring character's mass
character.AddForce(windForce, ForceMode.Acceleration);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 123fd4edbed747d08a7269e248ace9be
timeCreated: 1700531367

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 42098e87a8999af49bfe9a9ecd5893f2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 85df588ce823dcf4c8398f90f34ea68c
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 584e635a936d48cba39504fbe0661830
timeCreated: 1701142404

View File

@@ -1,46 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex62
{
/// <summary>
/// This example extends a Character (through composition) to apply a landing force
/// when it lands on a dynamic rigidbody.
///
/// The landing force is calculated (characterMass * characterGravity * landingVelocity * landingForceMag)
/// and is applied along gravity direction.
/// </summary>
public class ApplyLandingForce : MonoBehaviour
{
public float landingForceScale = 1.0f;
private Character _character;
private void Awake()
{
_character = GetComponent<Character>();
}
private void OnEnable()
{
_character.Landed += OnLanded;
}
private void OnDisable()
{
_character.Landed -= OnLanded;
}
private void OnLanded(Vector3 landingVelocity)
{
Rigidbody groundRigidbody = _character.characterMovement.groundRigidbody;
if (!groundRigidbody)
return;
Vector3 force = _character.GetGravityVector() *
(_character.mass * landingVelocity.magnitude * landingForceScale);
groundRigidbody.AddForceAtPosition(force, _character.position);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 931fef3c18e6491c84e85c9053988e76
timeCreated: 1701142457

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: d421ad9c95a075e41ad7e322fad3fab4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 0b6d4b013652a42439ede26cceb9934b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 06614c948fd0d0c47bbe6cf041581625
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 28a2ef0b4d48ae1438822b95de1828ab
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,88 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex71
{
/// <summary>
/// This example shows how to implement a moving platform.
/// It will loop from its start position (ie: transform.position) to its target position
/// (ie: startPosition + offset) during moveTime seconds.
/// </summary>
[RequireComponent(typeof(Rigidbody))]
public class KinematicMove : MonoBehaviour
{
#region FIELDS
[SerializeField]
public float _moveTime = 3.0f;
[SerializeField]
private Vector3 _offset;
#endregion
#region PRIVATE FIELDS
private Rigidbody _rigidbody;
private Vector3 _startPosition;
private Vector3 _targetPosition;
#endregion
#region PROPERTIES
public float moveTime
{
get => _moveTime;
set => _moveTime = Mathf.Max(0.0001f, value);
}
public Vector3 offset
{
get => _offset;
set => _offset = value;
}
#endregion
#region METHODS
/// <summary>
/// Sinusoidal ease function.
/// </summary>
public static float EaseInOut(float time, float duration)
{
return -0.5f * (Mathf.Cos(Mathf.PI * time / duration) - 1.0f);
}
#endregion
#region MONOBEHAVIOUR
public void OnValidate()
{
moveTime = _moveTime;
}
public void Awake()
{
_rigidbody = GetComponent<Rigidbody>();
_rigidbody.isKinematic = true;
_startPosition = transform.position;
_targetPosition = _startPosition + offset;
}
public void FixedUpdate()
{
float t = EaseInOut(Mathf.PingPong(Time.time, _moveTime), _moveTime);
Vector3 p = Vector3.Lerp(_startPosition, _targetPosition, t);
_rigidbody.MovePosition(p);
}
#endregion
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: c2d405b3de076484b8e730438877207d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,70 +0,0 @@
using UnityEngine;
namespace ECM2.Walkthrough.Ex71
{
/// <summary>
/// This example shows how to implement a rotating platform.
/// This will freely rotate at the given rotation speed along its defined rotationAxis.
/// </summary>
[RequireComponent(typeof(Rigidbody))]
public class KinematicRotate : MonoBehaviour
{
#region FIELDS
[SerializeField]
private float _rotationSpeed = 30.0f;
public Vector3 rotationAxis = Vector3.up;
#endregion
#region PRIVATE FIELDS
private Rigidbody _rigidbody;
private float _angle;
#endregion
#region PROPERTIES
public float rotationSpeed
{
get => _rotationSpeed;
set => _rotationSpeed = value;
}
public float angle
{
get => _angle;
set => _angle = MathLib.ClampAngle(value, 0.0f, 360.0f);
}
#endregion
#region MONOBEHAVIOUR
public void OnValidate()
{
rotationSpeed = _rotationSpeed;
rotationAxis = rotationAxis.normalized;
}
public void Awake()
{
_rigidbody = GetComponent<Rigidbody>();
_rigidbody.isKinematic = true;
}
public void FixedUpdate()
{
angle += rotationSpeed * Time.deltaTime;
Quaternion rotation = Quaternion.AngleAxis(rotationSpeed * Time.deltaTime, rotationAxis.normalized);
_rigidbody.MoveRotation(_rigidbody.rotation * rotation);
}
#endregion
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: eee584f3f511f07478029e018c96d42f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Some files were not shown because too many files have changed in this diff Show More