移除ECM2
This commit is contained in:
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ec572efc033bf4d4981ad6f0826644a6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 885247a2d1515d845a67d8ac710ebd50
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 01a66eee63ba18d448eba9b1f3b2b6d5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 62e04b9d2fdce1d48a58d6f32dbe9d94
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f8ae32dc088988e4a8c1bc3aa94e1980
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1b54570a11beb04408cb0b800a30e3d4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 855c880aafd786e469e74d8dcc0f4fc8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a485e6ba4ca328418198154c3c5b8a9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 051ffeb8996dad2478867b59b30b8149
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ffee0df8c7b39c14aaf448ac6f058315
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8ed2487effc9e92479c5b2bb14904e09
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e69e7a765c2d6ab449adca049fb66006
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f6506b82daa82348be14fb6c81c641a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36e521298f3f4884caf7d4e3cca0e81e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6baa13809475a0b4e8c754503a48fcd6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3a07d0194ce491a4481b2bc6e4adcddf
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26e3edf69cc50474888179da47b38ab3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: df5e43a2b20112544875caa4d72e1b22
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 218dc7872e014a538fe2f1f1b732e706
|
||||
timeCreated: 1700123862
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 637965ac47304625a97a4eb85d5b98af
|
||||
timeCreated: 1700123873
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a975b64a803cefa47aaa4a3c1b8e9225
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f612ffbed25c174c8516cd491a87438
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a63ee7994c49a1e4e82074f9fb5cb6a0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f87749751c4088647acafff6304c760d
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89d104878c1437246b197fe4a829808d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0dff82c65b2d69948bcee99cdd3a44da
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c1896083ffaf5244b84ca31c6f727c7c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0da0459c0549421aa847206c393566c6
|
||||
timeCreated: 1700110443
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 04bd0a6d231620948b6e1f8642516c2d
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9a760961c1fb48c9a63d8126fd4299a1
|
||||
timeCreated: 1700174902
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0d88021f925b47469d907d1488264b49
|
||||
timeCreated: 1700110471
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aae1b8010de5d4a4ea1f944d9fe09bcc
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5af609ff5be14b28b526cb974a6662fa
|
||||
timeCreated: 1700115834
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4c37c58624030d74a9972d4a9d21fa15
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3deb2cb5bf2b15b4297ac3a7369fb3bb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea4bc13934a49484bb0606e7a1ff4f76
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4213399d96084b888c737cbc95143458
|
||||
timeCreated: 1700116698
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6d26fb9929014f51915cce2a9f023be5
|
||||
timeCreated: 1700267762
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 357780a279e73d64f9b373214e2dcd3c
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 92438bd78d11492aac3ba50f0a94bb22
|
||||
timeCreated: 1700267822
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fab4444b2b79402da8541e78d971cd89
|
||||
timeCreated: 1700267844
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 870821bf5541ca240b0f6eebcb635f97
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b0b19c6f0802fc749a37232c6360f455
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68a3136a575f419d888319ec1ee3a977
|
||||
timeCreated: 1700173831
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5ef935f2443c3ae4687c7cc025999221
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 865279845a5817441a4330415e7e2bad
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8d7237bdbeb48bb8206383a09c25b67
|
||||
timeCreated: 1700173847
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b678c156abb8426bbdf3d7ed245e0c4c
|
||||
timeCreated: 1700175120
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d8cf67ee3bd62b14f9d080638c0d5d70
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: badc34f9953d46e7adb11e016d6354a8
|
||||
timeCreated: 1700175243
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4e2bc2d1320241eb8fae230508f17ce1
|
||||
timeCreated: 1700175269
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 38f551d1ced263f4c9cc9e3b851e8af8
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c6227c91940406409f9456a4497e746
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aea89ac7ee934a84fa5e17eb9a6af80d
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c2b05f6db2b0334794284ad9654d3d2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e2f424a060a55e54fa1e050bdce93433
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 123fd4edbed747d08a7269e248ace9be
|
||||
timeCreated: 1700531367
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 42098e87a8999af49bfe9a9ecd5893f2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 85df588ce823dcf4c8398f90f34ea68c
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 584e635a936d48cba39504fbe0661830
|
||||
timeCreated: 1701142404
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 931fef3c18e6491c84e85c9053988e76
|
||||
timeCreated: 1701142457
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d421ad9c95a075e41ad7e322fad3fab4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b6d4b013652a42439ede26cceb9934b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 06614c948fd0d0c47bbe6cf041581625
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 28a2ef0b4d48ae1438822b95de1828ab
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c2d405b3de076484b8e730438877207d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user