Villeicht fix 3, villeicht ultimatieve zerstörung
This commit is contained in:
-75
@@ -1,75 +0,0 @@
|
|||||||
# ---> Unity
|
|
||||||
# This .gitignore file should be placed at the root of your Unity project directory
|
|
||||||
#
|
|
||||||
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
|
||||||
#
|
|
||||||
/[Ll]ibrary/
|
|
||||||
/[Tt]emp/
|
|
||||||
/[Oo]bj/
|
|
||||||
/[Bb]uild/
|
|
||||||
/[Bb]uilds/
|
|
||||||
/[Ll]ogs/
|
|
||||||
/[Uu]ser[Ss]ettings/
|
|
||||||
|
|
||||||
# MemoryCaptures can get excessive in size.
|
|
||||||
# They also could contain extremely sensitive data
|
|
||||||
/[Mm]emoryCaptures/
|
|
||||||
|
|
||||||
# Recordings can get excessive in size
|
|
||||||
/[Rr]ecordings/
|
|
||||||
|
|
||||||
# Uncomment this line if you wish to ignore the asset store tools plugin
|
|
||||||
# /[Aa]ssets/AssetStoreTools*
|
|
||||||
|
|
||||||
# Autogenerated Jetbrains Rider plugin
|
|
||||||
/[Aa]ssets/Plugins/Editor/JetBrains*
|
|
||||||
|
|
||||||
# Visual Studio cache directory
|
|
||||||
.vs/
|
|
||||||
|
|
||||||
# Gradle cache directory
|
|
||||||
.gradle/
|
|
||||||
|
|
||||||
# Autogenerated VS/MD/Consulo solution and project files
|
|
||||||
ExportedObj/
|
|
||||||
.consulo/
|
|
||||||
*.csproj
|
|
||||||
*.unityproj
|
|
||||||
*.sln
|
|
||||||
*.suo
|
|
||||||
*.tmp
|
|
||||||
*.user
|
|
||||||
*.userprefs
|
|
||||||
*.pidb
|
|
||||||
*.booproj
|
|
||||||
*.svd
|
|
||||||
*.pdb
|
|
||||||
*.mdb
|
|
||||||
*.opendb
|
|
||||||
*.VC.db
|
|
||||||
|
|
||||||
# Unity3D generated meta files
|
|
||||||
*.pidb.meta
|
|
||||||
*.pdb.meta
|
|
||||||
*.mdb.meta
|
|
||||||
|
|
||||||
# Unity3D generated file on crash reports
|
|
||||||
sysinfo.txt
|
|
||||||
|
|
||||||
# Builds
|
|
||||||
*.apk
|
|
||||||
*.aab
|
|
||||||
*.unitypackage
|
|
||||||
*.unitypackage.meta
|
|
||||||
*.app
|
|
||||||
|
|
||||||
# Crashlytics generated file
|
|
||||||
crashlytics-build.properties
|
|
||||||
|
|
||||||
# Packed Addressables
|
|
||||||
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
|
|
||||||
|
|
||||||
# Temporary auto-generated Android Assets
|
|
||||||
/[Aa]ssets/[Ss]treamingAssets/aa.meta
|
|
||||||
/[Aa]ssets/[Ss]treamingAssets/aa/*
|
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"Version": 1,
|
||||||
|
"WorkspaceRootPath": "C:\\Users\\bib\\Documents\\ClearTheZone\\",
|
||||||
|
"Documents": [
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{B4CD19DA-EE08-5225-FB19-1D0DFA4113DD}|Assembly-CSharp.csproj|c:\\users\\bib\\documents\\clearthezone\\assets\\scripts\\door_rotate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{B4CD19DA-EE08-5225-FB19-1D0DFA4113DD}|Assembly-CSharp.csproj|solutionrelative:assets\\scripts\\door_rotate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{B4CD19DA-EE08-5225-FB19-1D0DFA4113DD}|Assembly-CSharp.csproj|c:\\users\\bib\\documents\\clearthezone\\assets\\scripts\\playercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{B4CD19DA-EE08-5225-FB19-1D0DFA4113DD}|Assembly-CSharp.csproj|solutionrelative:assets\\scripts\\playercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"DocumentGroupContainers": [
|
||||||
|
{
|
||||||
|
"Orientation": 0,
|
||||||
|
"VerticalTabListWidth": 256,
|
||||||
|
"DocumentGroups": [
|
||||||
|
{
|
||||||
|
"DockedWidth": 200,
|
||||||
|
"SelectedChildIndex": 5,
|
||||||
|
"Children": [
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{c9c0ae26-aa77-11d2-b3f0-0000f87570ee}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 1,
|
||||||
|
"Title": "PlayerController.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"ToolTip": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"RelativeToolTip": "Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAmAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-12T10:55:03.253Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 0,
|
||||||
|
"Title": "Door_Rotate.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"ToolTip": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"RelativeToolTip": "Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"ViewState": "AgIAABsAAAAAAAAAAAArwBkAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-16T12:36:56.83Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
"Version": 1,
|
||||||
|
"WorkspaceRootPath": "C:\\Users\\bib\\Documents\\ClearTheZone\\",
|
||||||
|
"Documents": [
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{B4CD19DA-EE08-5225-FB19-1D0DFA4113DD}|Assembly-CSharp.csproj|c:\\users\\bib\\documents\\clearthezone\\assets\\scripts\\door_rotate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{B4CD19DA-EE08-5225-FB19-1D0DFA4113DD}|Assembly-CSharp.csproj|solutionrelative:assets\\scripts\\door_rotate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Assets\\Scripts\\PlayerController.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:2:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:2:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Assets\\Scripts\\PlayerController.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"DocumentGroupContainers": [
|
||||||
|
{
|
||||||
|
"Orientation": 0,
|
||||||
|
"VerticalTabListWidth": 256,
|
||||||
|
"DocumentGroups": [
|
||||||
|
{
|
||||||
|
"DockedWidth": 200,
|
||||||
|
"SelectedChildIndex": 3,
|
||||||
|
"Children": [
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Bookmark",
|
||||||
|
"Name": "ST:0:0:{c9c0ae26-aa77-11d2-b3f0-0000f87570ee}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 0,
|
||||||
|
"Title": "Door_Rotate.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"ToolTip": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"RelativeToolTip": "Assets\\Scripts\\Door_Rotate.cs",
|
||||||
|
"ViewState": "AgIAACQAAAAAAAAAAAA2wBoAAAARAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-16T12:36:56.83Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 1,
|
||||||
|
"Title": "PlayerController.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"ToolTip": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"RelativeToolTip": "Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAFAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-18T10:21:53.85Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 2,
|
||||||
|
"Title": "PlayerController.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"ToolTip": "C:\\Users\\bib\\Documents\\ClearTheZone\\Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"RelativeToolTip": "Assets\\Scripts\\PlayerController.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAmAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-12T10:55:03.253Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+303
@@ -0,0 +1,303 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
// Called by AnimationEvent on Walk_N animation
|
||||||
|
// Add footstep sound logic here if needed
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+297
@@ -0,0 +1,297 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+297
@@ -0,0 +1,297 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
+335
@@ -0,0 +1,335 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
// Beispiel: https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+334
@@ -0,0 +1,334 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+334
@@ -0,0 +1,334 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+330
@@ -0,0 +1,330 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+330
@@ -0,0 +1,330 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+333
@@ -0,0 +1,333 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+334
@@ -0,0 +1,334 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+333
@@ -0,0 +1,333 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+330
@@ -0,0 +1,330 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+332
@@ -0,0 +1,332 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// Kamera-Bewegung seit letztem Frame
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
// Leichtes "Wackeln" basierend auf Input
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+333
@@ -0,0 +1,333 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// Item als Kind der Kamera setzen
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f); // Standard-Handposition
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// Kamera-Bewegung seit letztem Frame
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
// Leichtes "Wackeln" basierend auf Input
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+332
@@ -0,0 +1,332 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// Kamera-Bewegung seit letztem Frame
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
// Leichtes "Wackeln" basierend auf Input
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+333
@@ -0,0 +1,333 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// Item als Kind der Kamera setzen
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f); // Standard-Handposition
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// Kamera-Bewegung seit letztem Frame
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
// Leichtes "Wackeln" basierend auf Input
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
[SerializeField] private Vector3 rotationOffset = Vector3.zero;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
private Vector3 pivotPoint;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
|
||||||
|
// Calculate pivot point from rotation offset
|
||||||
|
pivotPoint = transform.position + rotationOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
-6
@@ -1,5 +1,4 @@
|
|||||||
//Morten
|
using UnityEngine;
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
public class Door_Rotate : MonoBehaviour
|
public class Door_Rotate : MonoBehaviour
|
||||||
{
|
{
|
||||||
@@ -21,13 +20,12 @@ public class Door_Rotate : MonoBehaviour
|
|||||||
currentRotation = transform.localEulerAngles.y;
|
currentRotation = transform.localEulerAngles.y;
|
||||||
targetRotation = currentRotation;
|
targetRotation = currentRotation;
|
||||||
|
|
||||||
|
// Calculate pivot point from rotation offset
|
||||||
pivotPoint = transform.position + rotationOffset;
|
pivotPoint = transform.position + rotationOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
if (PauseMenu.GameIsPaused) return;
|
|
||||||
|
|
||||||
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
{
|
{
|
||||||
ToggleDoor();
|
ToggleDoor();
|
||||||
@@ -41,11 +39,12 @@ public class Door_Rotate : MonoBehaviour
|
|||||||
isOpen = !isOpen;
|
isOpen = !isOpen;
|
||||||
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
}
|
}
|
||||||
//glatte bewegung der tür
|
|
||||||
private void SmoothRotateDoor()
|
private void SmoothRotateDoor()
|
||||||
{
|
{
|
||||||
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
|
||||||
|
// Rotate around the pivot point
|
||||||
transform.RotateAround(pivotPoint, Vector3.up, (currentRotation - transform.localEulerAngles.y));
|
transform.RotateAround(pivotPoint, Vector3.up, (currentRotation - transform.localEulerAngles.y));
|
||||||
transform.localEulerAngles = new Vector3(
|
transform.localEulerAngles = new Vector3(
|
||||||
transform.localEulerAngles.x,
|
transform.localEulerAngles.x,
|
||||||
@@ -53,7 +52,7 @@ public class Door_Rotate : MonoBehaviour
|
|||||||
transform.localEulerAngles.z
|
transform.localEulerAngles.z
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
//checkt ob der spieler auf die Tür schaut und ob er nah genug ist, um sie zu öffnen https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.Raycast.html
|
|
||||||
private bool IsPlayerLooking()
|
private bool IsPlayerLooking()
|
||||||
{
|
{
|
||||||
if (playerCamera == null) return false;
|
if (playerCamera == null) return false;
|
||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
[SerializeField] private Vector3 rotationOffset = Vector3.zero;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
private Vector3 pivotPoint;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+397
@@ -0,0 +1,397 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Note: animations are called via the controller for both the character and capsule using animator null checks
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public AudioSource AudioFootsteps;
|
||||||
|
public AudioSource LandingAudio;
|
||||||
|
public AudioSource AudioFoley;
|
||||||
|
public AudioClip LandingAudioClip;
|
||||||
|
public AudioClip[] FootstepAudioClips;
|
||||||
|
[Range(0, 1)] public float FootstepAudioVolume = 0.5f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("Cinemachine")]
|
||||||
|
[Tooltip("The follow target set in the Cinemachine Virtual Camera that the camera will follow")]
|
||||||
|
public GameObject CinemachineCameraTarget;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
[Tooltip("Additional degress to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
// cinemachine
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
// player
|
||||||
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
|
private float _targetRotation = 0.0f;
|
||||||
|
private float _rotationVelocity;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
// timeout deltatime
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
// animation IDs
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private GameObject _mainCamera;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
// get a reference to our main camera
|
||||||
|
if (_mainCamera == null)
|
||||||
|
{
|
||||||
|
_mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = CinemachineCameraTarget.transform.rotation.eulerAngles.y;
|
||||||
|
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
AssignAnimationIDs();
|
||||||
|
|
||||||
|
// reset our timeouts on start
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
// set sphere position, with offset
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
// if there is an input and camera position is not fixed
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
//Don't multiply mouse input by Time.deltaTime;
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clamp our rotations so our values are limited 360 degrees
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
|
||||||
|
// Cinemachine will follow this target
|
||||||
|
CinemachineCameraTarget.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
// set target speed based on move speed, sprint speed and if sprint is pressed
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
|
||||||
|
// a simplistic acceleration and deceleration designed to be easy to remove, replace, or iterate upon
|
||||||
|
|
||||||
|
// note: Vector2's == operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is no input, set the target speed to 0
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
|
||||||
|
// a reference to the players current horizontal velocity
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
|
||||||
|
// accelerate or decelerate to target speed
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
// creates curved result rather than a linear one giving a more organic speed change
|
||||||
|
// note T in Lerp is clamped, so we don't need to clamp our speed
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
|
||||||
|
// round speed to 3 decimal places
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
|
|
||||||
|
// normalise input direction
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
|
||||||
|
// note: Vector2's != operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is a move input rotate player when the player is moving
|
||||||
|
if (_input.move != Vector2.zero)
|
||||||
|
{
|
||||||
|
_targetRotation = Mathf.Atan2(inputDirection.x, inputDirection.z) * Mathf.Rad2Deg +
|
||||||
|
_mainCamera.transform.eulerAngles.y;
|
||||||
|
float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, _targetRotation, ref _rotationVelocity,
|
||||||
|
RotationSmoothTime);
|
||||||
|
|
||||||
|
// rotate to face input direction relative to camera position
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, rotation, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 targetDirection = Quaternion.Euler(0.0f, _targetRotation, 0.0f) * Vector3.forward;
|
||||||
|
|
||||||
|
// move the player
|
||||||
|
_controller.Move(targetDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
// reset the fall timeout timer
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop our velocity dropping infinitely when grounded
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
// the square root of H * -2 * G = how much velocity needed to reach desired height
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// jump timeout
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// reset the jump timeout timer
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
|
||||||
|
// fall timeout
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we are not grounded, do not jump
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply gravity over time if under terminal (multiply by delta time twice to linearly speed up over time)
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
|
||||||
|
// when selected, draw a gizmo in the position of, and matching radius of, the grounded collider
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (AudioFootsteps != null)
|
||||||
|
AudioFootsteps.Play();
|
||||||
|
if (AudioFoley != null)
|
||||||
|
AudioFoley.Play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnLand(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
if (LandingAudio != null)
|
||||||
|
LandingAudio.Play();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
[SerializeField] private Vector3 rotationOffset = Vector3.zero;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
private Vector3 pivotPoint;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
[SerializeField] private Vector3 rotationOffset = Vector3.zero;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
private Vector3 pivotPoint;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
|
||||||
|
// Calculate pivot point from rotation offset
|
||||||
|
pivotPoint = transform.position + rotationOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+320
@@ -0,0 +1,320 @@
|
|||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
public GameObject[] Items;
|
||||||
|
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
private float _speed;
|
||||||
|
|
||||||
|
private float _verticalVelocity;
|
||||||
|
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
|
||||||
|
private CharacterController _controller;
|
||||||
|
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
|
||||||
|
private Animator _animator;
|
||||||
|
|
||||||
|
private int _animIDSpeed;
|
||||||
|
|
||||||
|
private int _animIDGrounded;
|
||||||
|
|
||||||
|
private int _animIDJump;
|
||||||
|
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _playerInput != null && _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+321
@@ -0,0 +1,321 @@
|
|||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
public GameObject[] Items;
|
||||||
|
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
private float _speed;
|
||||||
|
|
||||||
|
private float _verticalVelocity;
|
||||||
|
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
|
||||||
|
private CharacterController _controller;
|
||||||
|
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
|
||||||
|
private Animator _animator;
|
||||||
|
|
||||||
|
private int _animIDSpeed;
|
||||||
|
|
||||||
|
private int _animIDGrounded;
|
||||||
|
|
||||||
|
private int _animIDJump;
|
||||||
|
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _playerInput != null && _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
// Entferne doppelte LateUpdate-Methoden, falls vorhanden
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+320
@@ -0,0 +1,320 @@
|
|||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
public GameObject[] Items;
|
||||||
|
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
private float _speed;
|
||||||
|
|
||||||
|
private float _verticalVelocity;
|
||||||
|
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
|
||||||
|
private CharacterController _controller;
|
||||||
|
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
|
||||||
|
private Animator _animator;
|
||||||
|
|
||||||
|
private int _animIDSpeed;
|
||||||
|
|
||||||
|
private int _animIDGrounded;
|
||||||
|
|
||||||
|
private int _animIDJump;
|
||||||
|
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _playerInput != null && _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update is called once per frame
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private float openAngle = 90f;
|
||||||
|
[SerializeField] private float rotationSpeed = 2f;
|
||||||
|
[SerializeField] private float interactionDistance = 5f;
|
||||||
|
|
||||||
|
private float targetRotation = 0f;
|
||||||
|
private float currentRotation = 0f;
|
||||||
|
private bool isOpen = false;
|
||||||
|
private Camera playerCamera;
|
||||||
|
|
||||||
|
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
playerCamera = Camera.main;
|
||||||
|
currentRotation = transform.localEulerAngles.y;
|
||||||
|
targetRotation = currentRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update is called once per frame
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
|
||||||
|
{
|
||||||
|
ToggleDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
SmoothRotateDoor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleDoor()
|
||||||
|
{
|
||||||
|
isOpen = !isOpen;
|
||||||
|
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SmoothRotateDoor()
|
||||||
|
{
|
||||||
|
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
|
||||||
|
transform.localEulerAngles = new Vector3(
|
||||||
|
transform.localEulerAngles.x,
|
||||||
|
currentRotation,
|
||||||
|
transform.localEulerAngles.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPlayerLooking()
|
||||||
|
{
|
||||||
|
if (playerCamera == null) return false;
|
||||||
|
|
||||||
|
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
|
||||||
|
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
|
||||||
|
|
||||||
|
if (distanceToPlayer > interactionDistance) return false;
|
||||||
|
|
||||||
|
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
|
||||||
|
{
|
||||||
|
return hit.collider.gameObject == gameObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
+397
@@ -0,0 +1,397 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Note: animations are called via the controller for both the character and capsule using animator null checks
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public AudioSource AudioFootsteps;
|
||||||
|
public AudioSource LandingAudio;
|
||||||
|
public AudioSource AudioFoley;
|
||||||
|
public AudioClip LandingAudioClip;
|
||||||
|
public AudioClip[] FootstepAudioClips;
|
||||||
|
[Range(0, 1)] public float FootstepAudioVolume = 0.5f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("Cinemachine")]
|
||||||
|
[Tooltip("The follow target set in the Cinemachine Virtual Camera that the camera will follow")]
|
||||||
|
public GameObject CinemachineCameraTarget;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
[Tooltip("Additional degress to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
// cinemachine
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
// player
|
||||||
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
|
private float _targetRotation = 0.0f;
|
||||||
|
private float _rotationVelocity;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
// timeout deltatime
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
// animation IDs
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private GameObject _mainCamera;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
// get a reference to our main camera
|
||||||
|
if (_mainCamera == null)
|
||||||
|
{
|
||||||
|
_mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = CinemachineCameraTarget.transform.rotation.eulerAngles.y;
|
||||||
|
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
AssignAnimationIDs();
|
||||||
|
|
||||||
|
// reset our timeouts on start
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
// set sphere position, with offset
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
// if there is an input and camera position is not fixed
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
//Don't multiply mouse input by Time.deltaTime;
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clamp our rotations so our values are limited 360 degrees
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
|
||||||
|
// Cinemachine will follow this target
|
||||||
|
CinemachineCameraTarget.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
// set target speed based on move speed, sprint speed and if sprint is pressed
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
|
||||||
|
// a simplistic acceleration and deceleration designed to be easy to remove, replace, or iterate upon
|
||||||
|
|
||||||
|
// note: Vector2's == operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is no input, set the target speed to 0
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
|
||||||
|
// a reference to the players current horizontal velocity
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
|
||||||
|
// accelerate or decelerate to target speed
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
// creates curved result rather than a linear one giving a more organic speed change
|
||||||
|
// note T in Lerp is clamped, so we don't need to clamp our speed
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
|
||||||
|
// round speed to 3 decimal places
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
|
|
||||||
|
// normalise input direction
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
|
||||||
|
// note: Vector2's != operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is a move input rotate player when the player is moving
|
||||||
|
if (_input.move != Vector2.zero)
|
||||||
|
{
|
||||||
|
_targetRotation = Mathf.Atan2(inputDirection.x, inputDirection.z) * Mathf.Rad2Deg +
|
||||||
|
_mainCamera.transform.eulerAngles.y;
|
||||||
|
float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, _targetRotation, ref _rotationVelocity,
|
||||||
|
RotationSmoothTime);
|
||||||
|
|
||||||
|
// rotate to face input direction relative to camera position
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, rotation, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 targetDirection = Quaternion.Euler(0.0f, _targetRotation, 0.0f) * Vector3.forward;
|
||||||
|
|
||||||
|
// move the player
|
||||||
|
_controller.Move(targetDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
// reset the fall timeout timer
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop our velocity dropping infinitely when grounded
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
// the square root of H * -2 * G = how much velocity needed to reach desired height
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// jump timeout
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// reset the jump timeout timer
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
|
||||||
|
// fall timeout
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we are not grounded, do not jump
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply gravity over time if under terminal (multiply by delta time twice to linearly speed up over time)
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
|
||||||
|
// when selected, draw a gizmo in the position of, and matching radius of, the grounded collider
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (AudioFootsteps != null)
|
||||||
|
AudioFootsteps.Play();
|
||||||
|
if (AudioFoley != null)
|
||||||
|
AudioFoley.Play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnLand(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
if (LandingAudio != null)
|
||||||
|
LandingAudio.Play();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class Door_Rotate : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update is called once per frame
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+220
@@ -0,0 +1,220 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+220
@@ -0,0 +1,220 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+222
@@ -0,0 +1,222 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+333
@@ -0,0 +1,333 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// Item als Kind der Kamera setzen
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f); // Standard-Handposition
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// Kamera-Bewegung seit letztem Frame
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
// Leichtes "Wackeln" basierend auf Input
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+302
@@ -0,0 +1,302 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+302
@@ -0,0 +1,302 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+297
@@ -0,0 +1,297 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
[Header("Items/Guns Switching")]
|
||||||
|
[Tooltip("Alle Items/Guns als GameObjects, die als Kindobjekte am Spieler hängen.")]
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+222
@@ -0,0 +1,222 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+222
@@ -0,0 +1,222 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Charakter mit der Kamera drehen (Y-Achse)
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+282
@@ -0,0 +1,282 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
public bool Grounded = true;
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _playerInput != null && _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+284
@@ -0,0 +1,284 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
public bool Grounded = true;
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+284
@@ -0,0 +1,284 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
public bool Grounded = true;
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
public GameObject[] Items;
|
||||||
|
private int currentItemIndex = 0;
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private Animator _animator;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
HandleItemSwitch();
|
||||||
|
}
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _speed);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleItemSwitch()
|
||||||
|
{
|
||||||
|
float scroll = Input.GetAxis("Mouse ScrollWheel");
|
||||||
|
if (scroll > 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex + 1) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
else if (scroll < 0f)
|
||||||
|
{
|
||||||
|
currentItemIndex = (currentItemIndex - 1 + Items.Length) % Items.Length;
|
||||||
|
ActivateItem(currentItemIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActivateItem(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Items.Length; i++)
|
||||||
|
{
|
||||||
|
if (Items[i] != null)
|
||||||
|
{
|
||||||
|
Items[i].SetActive(i == index);
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform.SetParent.html
|
||||||
|
Items[i].transform.SetParent(PlayerCamera.transform);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localPosition.html
|
||||||
|
Items[i].transform.localPosition = new Vector3(0.4f, -0.3f, 0.7f);
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Transform-localRotation.html
|
||||||
|
Items[i].transform.localRotation = Quaternion.identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 lastLook;
|
||||||
|
private Vector2 wiggleOffset;
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
UpdateItemWiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateItemWiggle()
|
||||||
|
{
|
||||||
|
if (Items != null && Items.Length > 0 && Items[currentItemIndex] != null && Items[currentItemIndex].activeSelf)
|
||||||
|
{
|
||||||
|
// https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
|
||||||
|
Vector2 lookDelta = _input.look - lastLook;
|
||||||
|
lastLook = _input.look;
|
||||||
|
wiggleOffset = Vector2.Lerp(wiggleOffset, lookDelta * 0.05f, 0.2f);
|
||||||
|
Items[currentItemIndex].transform.localPosition = new Vector3(0.4f + wiggleOffset.x, -0.3f + wiggleOffset.y, 0.7f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep()
|
||||||
|
{
|
||||||
|
//Bugfix
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+220
@@ -0,0 +1,220 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Bitte Tools/Starter Assets/Reinstall Dependencies nutzen.");
|
||||||
|
#endif
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+82
-32
@@ -1,53 +1,99 @@
|
|||||||
namespace StarterAssets
|
using UnityEngine;
|
||||||
{
|
#if ENABLE_INPUT_SYSTEM
|
||||||
using UnityEngine;
|
using UnityEngine.InputSystem;
|
||||||
using UnityEngine.InputSystem;
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
[RequireComponent(typeof(CharacterController))]
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
[RequireComponent(typeof(PlayerInput))]
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
public class ThirdPersonController : MonoBehaviour
|
public class ThirdPersonController : MonoBehaviour
|
||||||
{
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
public float MoveSpeed = 2.0f;
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
public float SprintSpeed = 5.335f;
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
public float SpeedChangeRate = 10.0f;
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
public float JumpHeight = 1.2f;
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
public float Gravity = -15.0f;
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
public float JumpTimeout = 0.50f;
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
public float FallTimeout = 0.15f;
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
public bool Grounded = true;
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
public float GroundedOffset = -0.14f;
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
public float GroundedRadius = 0.28f;
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
public LayerMask GroundLayers;
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
public Camera PlayerCamera;
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
public float TopClamp = 70.0f;
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
public float BottomClamp = -30.0f;
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
public float CameraAngleOverride = 0.0f;
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
public bool LockCameraPosition = false;
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
private float _cinemachineTargetYaw;
|
private float _cinemachineTargetYaw;
|
||||||
private float _cinemachineTargetPitch;
|
private float _cinemachineTargetPitch;
|
||||||
private float _speed;
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
private float _verticalVelocity;
|
private float _verticalVelocity;
|
||||||
private float _terminalVelocity = 53.0f;
|
private float _terminalVelocity = 53.0f;
|
||||||
private float _jumpTimeoutDelta;
|
private float _jumpTimeoutDelta;
|
||||||
private float _fallTimeoutDelta;
|
private float _fallTimeoutDelta;
|
||||||
private PlayerInput _playerInput;
|
|
||||||
private CharacterController _controller;
|
|
||||||
private StarterAssetsInputs _input;
|
|
||||||
private Animator _animator;
|
|
||||||
private int _animIDSpeed;
|
private int _animIDSpeed;
|
||||||
private int _animIDGrounded;
|
private int _animIDGrounded;
|
||||||
private int _animIDJump;
|
private int _animIDJump;
|
||||||
private int _animIDFreeFall;
|
private int _animIDFreeFall;
|
||||||
private int _animIDMotionSpeed;
|
private int _animIDMotionSpeed;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
private const float _threshold = 0.01f;
|
private const float _threshold = 0.01f;
|
||||||
private bool _hasAnimator;
|
private bool _hasAnimator;
|
||||||
|
|
||||||
private bool IsCurrentDeviceMouse
|
private bool IsCurrentDeviceMouse
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return _playerInput != null && _playerInput.currentControlScheme == "KeyboardMouse";
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,10 +108,14 @@
|
|||||||
private void Start()
|
private void Start()
|
||||||
{
|
{
|
||||||
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
_controller = GetComponent<CharacterController>();
|
_controller = GetComponent<CharacterController>();
|
||||||
_input = GetComponent<StarterAssetsInputs>();
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
_hasAnimator = TryGetComponent(out _animator);
|
#if ENABLE_INPUT_SYSTEM
|
||||||
_playerInput = GetComponent<PlayerInput>();
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
AssignAnimationIDs();
|
AssignAnimationIDs();
|
||||||
_jumpTimeoutDelta = JumpTimeout;
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
_fallTimeoutDelta = FallTimeout;
|
_fallTimeoutDelta = FallTimeout;
|
||||||
@@ -73,6 +123,7 @@
|
|||||||
|
|
||||||
private void Update()
|
private void Update()
|
||||||
{
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
JumpAndGravity();
|
JumpAndGravity();
|
||||||
GroundedCheck();
|
GroundedCheck();
|
||||||
Move();
|
Move();
|
||||||
@@ -94,9 +145,10 @@
|
|||||||
|
|
||||||
private void GroundedCheck()
|
private void GroundedCheck()
|
||||||
{
|
{
|
||||||
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z);
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Physics.CheckSphere.html
|
transform.position.z);
|
||||||
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers, QueryTriggerInteraction.Ignore);
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
if (_hasAnimator)
|
if (_hasAnimator)
|
||||||
{
|
{
|
||||||
_animator.SetBool(_animIDGrounded, Grounded);
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
@@ -113,11 +165,11 @@
|
|||||||
}
|
}
|
||||||
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride, _cinemachineTargetYaw, 0.0f);
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
transform.rotation = Quaternion.Euler(0.0f, _cinemachineTargetYaw, 0.0f);
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Spieler dreht sich nicht automatisch zur Bewegungsrichtung
|
||||||
}
|
}
|
||||||
|
|
||||||
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/CharacterController.Move.html
|
|
||||||
private void Move()
|
private void Move()
|
||||||
{
|
{
|
||||||
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
@@ -125,27 +177,32 @@
|
|||||||
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
float speedOffset = 0.1f;
|
float speedOffset = 0.1f;
|
||||||
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
if (currentHorizontalSpeed < targetSpeed - speedOffset || currentHorizontalSpeed > targetSpeed + speedOffset)
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
{
|
{
|
||||||
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude, Time.deltaTime * SpeedChangeRate);
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_speed = targetSpeed;
|
_speed = targetSpeed;
|
||||||
}
|
}
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
// First Person: Bewegung relativ zur Kamera
|
||||||
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
moveDirection.y = 0f;
|
moveDirection.y = 0f;
|
||||||
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) + new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
if (_hasAnimator)
|
if (_hasAnimator)
|
||||||
{
|
{
|
||||||
_animator.SetFloat(_animIDSpeed, _speed);
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//https://docs.unity3d.com/6000.4/Documentation/ScriptReference/Mathf.Sqrt.html
|
|
||||||
private void JumpAndGravity()
|
private void JumpAndGravity()
|
||||||
{
|
{
|
||||||
if (Grounded)
|
if (Grounded)
|
||||||
@@ -202,22 +259,15 @@
|
|||||||
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnFootstep(AnimationEvent animationEvent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Die beiden teile sind einfach da damit das spiel nicht einfriert, immernoch keinen plan warum, aber es ist so
|
|
||||||
private void OnLand(AnimationEvent animationEvent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnDrawGizmosSelected()
|
private void OnDrawGizmosSelected()
|
||||||
{
|
{
|
||||||
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
if (Grounded) Gizmos.color = transparentGreen;
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
else Gizmos.color = transparentRed;
|
else Gizmos.color = transparentRed;
|
||||||
Gizmos.DrawSphere(new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z), GroundedRadius);
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+273
@@ -0,0 +1,273 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Spieler dreht sich nicht automatisch zur Bewegungsrichtung
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
// First Person: Bewegung relativ zur Kamera
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+273
@@ -0,0 +1,273 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("First Person Camera")]
|
||||||
|
[Tooltip("Camera attached to the player for first person view")]
|
||||||
|
public Camera PlayerCamera;
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
[Tooltip("Additional degrees to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
private bool _hasAnimator;
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (PlayerCamera == null)
|
||||||
|
{
|
||||||
|
PlayerCamera = Camera.main;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = PlayerCamera.transform.rotation.eulerAngles.y;
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
|
AssignAnimationIDs();
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
PlayerCamera.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
// Spieler dreht sich nicht automatisch zur Bewegungsrichtung
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
// First Person: Bewegung relativ zur Kamera
|
||||||
|
Vector3 moveDirection = PlayerCamera.transform.right * inputDirection.x + PlayerCamera.transform.forward * inputDirection.z;
|
||||||
|
moveDirection.y = 0f;
|
||||||
|
_controller.Move(moveDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+397
@@ -0,0 +1,397 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Note: animations are called via the controller for both the character and capsule using animator null checks
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public AudioSource AudioFootsteps;
|
||||||
|
public AudioSource LandingAudio;
|
||||||
|
public AudioSource AudioFoley;
|
||||||
|
public AudioClip LandingAudioClip;
|
||||||
|
public AudioClip[] FootstepAudioClips;
|
||||||
|
[Range(0, 1)] public float FootstepAudioVolume = 0.5f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("Cinemachine")]
|
||||||
|
[Tooltip("The follow target set in the Cinemachine Virtual Camera that the camera will follow")]
|
||||||
|
public GameObject CinemachineCameraTarget;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
[Tooltip("Additional degress to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
// cinemachine
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
// player
|
||||||
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
|
private float _targetRotation = 0.0f;
|
||||||
|
private float _rotationVelocity;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
// timeout deltatime
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
// animation IDs
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private GameObject _mainCamera;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
// get a reference to our main camera
|
||||||
|
if (_mainCamera == null)
|
||||||
|
{
|
||||||
|
_mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = CinemachineCameraTarget.transform.rotation.eulerAngles.y;
|
||||||
|
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
AssignAnimationIDs();
|
||||||
|
|
||||||
|
// reset our timeouts on start
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
// set sphere position, with offset
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
// if there is an input and camera position is not fixed
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
//Don't multiply mouse input by Time.deltaTime;
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clamp our rotations so our values are limited 360 degrees
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
|
||||||
|
// Cinemachine will follow this target
|
||||||
|
CinemachineCameraTarget.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
// set target speed based on move speed, sprint speed and if sprint is pressed
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
|
||||||
|
// a simplistic acceleration and deceleration designed to be easy to remove, replace, or iterate upon
|
||||||
|
|
||||||
|
// note: Vector2's == operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is no input, set the target speed to 0
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
|
||||||
|
// a reference to the players current horizontal velocity
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
|
||||||
|
// accelerate or decelerate to target speed
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
// creates curved result rather than a linear one giving a more organic speed change
|
||||||
|
// note T in Lerp is clamped, so we don't need to clamp our speed
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
|
||||||
|
// round speed to 3 decimal places
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
|
|
||||||
|
// normalise input direction
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
|
||||||
|
// note: Vector2's != operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is a move input rotate player when the player is moving
|
||||||
|
if (_input.move != Vector2.zero)
|
||||||
|
{
|
||||||
|
_targetRotation = Mathf.Atan2(inputDirection.x, inputDirection.z) * Mathf.Rad2Deg +
|
||||||
|
_mainCamera.transform.eulerAngles.y;
|
||||||
|
float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, _targetRotation, ref _rotationVelocity,
|
||||||
|
RotationSmoothTime);
|
||||||
|
|
||||||
|
// rotate to face input direction relative to camera position
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, rotation, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 targetDirection = Quaternion.Euler(0.0f, _targetRotation, 0.0f) * Vector3.forward;
|
||||||
|
|
||||||
|
// move the player
|
||||||
|
_controller.Move(targetDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
// reset the fall timeout timer
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop our velocity dropping infinitely when grounded
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
// the square root of H * -2 * G = how much velocity needed to reach desired height
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// jump timeout
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// reset the jump timeout timer
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
|
||||||
|
// fall timeout
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we are not grounded, do not jump
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply gravity over time if under terminal (multiply by delta time twice to linearly speed up over time)
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
|
||||||
|
// when selected, draw a gizmo in the position of, and matching radius of, the grounded collider
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (AudioFootsteps != null)
|
||||||
|
AudioFootsteps.Play();
|
||||||
|
if (AudioFoley != null)
|
||||||
|
AudioFoley.Play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnLand(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
if (LandingAudio != null)
|
||||||
|
LandingAudio.Play();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+397
@@ -0,0 +1,397 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Note: animations are called via the controller for both the character and capsule using animator null checks
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace StarterAssets
|
||||||
|
{
|
||||||
|
[RequireComponent(typeof(CharacterController))]
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
[RequireComponent(typeof(PlayerInput))]
|
||||||
|
#endif
|
||||||
|
public class ThirdPersonController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Player")]
|
||||||
|
[Tooltip("Move speed of the character in m/s")]
|
||||||
|
public float MoveSpeed = 2.0f;
|
||||||
|
|
||||||
|
[Tooltip("Sprint speed of the character in m/s")]
|
||||||
|
public float SprintSpeed = 5.335f;
|
||||||
|
|
||||||
|
[Tooltip("How fast the character turns to face movement direction")]
|
||||||
|
[Range(0.0f, 0.3f)]
|
||||||
|
public float RotationSmoothTime = 0.12f;
|
||||||
|
|
||||||
|
[Tooltip("Acceleration and deceleration")]
|
||||||
|
public float SpeedChangeRate = 10.0f;
|
||||||
|
|
||||||
|
public AudioSource AudioFootsteps;
|
||||||
|
public AudioSource LandingAudio;
|
||||||
|
public AudioSource AudioFoley;
|
||||||
|
public AudioClip LandingAudioClip;
|
||||||
|
public AudioClip[] FootstepAudioClips;
|
||||||
|
[Range(0, 1)] public float FootstepAudioVolume = 0.5f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("The height the player can jump")]
|
||||||
|
public float JumpHeight = 1.2f;
|
||||||
|
|
||||||
|
[Tooltip("The character uses its own gravity value. The engine default is -9.81f")]
|
||||||
|
public float Gravity = -15.0f;
|
||||||
|
|
||||||
|
[Space(10)]
|
||||||
|
[Tooltip("Time required to pass before being able to jump again. Set to 0f to instantly jump again")]
|
||||||
|
public float JumpTimeout = 0.50f;
|
||||||
|
|
||||||
|
[Tooltip("Time required to pass before entering the fall state. Useful for walking down stairs")]
|
||||||
|
public float FallTimeout = 0.15f;
|
||||||
|
|
||||||
|
[Header("Player Grounded")]
|
||||||
|
[Tooltip("If the character is grounded or not. Not part of the CharacterController built in grounded check")]
|
||||||
|
public bool Grounded = true;
|
||||||
|
|
||||||
|
[Tooltip("Useful for rough ground")]
|
||||||
|
public float GroundedOffset = -0.14f;
|
||||||
|
|
||||||
|
[Tooltip("The radius of the grounded check. Should match the radius of the CharacterController")]
|
||||||
|
public float GroundedRadius = 0.28f;
|
||||||
|
|
||||||
|
[Tooltip("What layers the character uses as ground")]
|
||||||
|
public LayerMask GroundLayers;
|
||||||
|
|
||||||
|
[Header("Cinemachine")]
|
||||||
|
[Tooltip("The follow target set in the Cinemachine Virtual Camera that the camera will follow")]
|
||||||
|
public GameObject CinemachineCameraTarget;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera up")]
|
||||||
|
public float TopClamp = 70.0f;
|
||||||
|
|
||||||
|
[Tooltip("How far in degrees can you move the camera down")]
|
||||||
|
public float BottomClamp = -30.0f;
|
||||||
|
|
||||||
|
[Tooltip("Additional degress to override the camera. Useful for fine tuning camera position when locked")]
|
||||||
|
public float CameraAngleOverride = 0.0f;
|
||||||
|
|
||||||
|
[Tooltip("For locking the camera position on all axis")]
|
||||||
|
public bool LockCameraPosition = false;
|
||||||
|
|
||||||
|
// cinemachine
|
||||||
|
private float _cinemachineTargetYaw;
|
||||||
|
private float _cinemachineTargetPitch;
|
||||||
|
|
||||||
|
// player
|
||||||
|
private float _speed;
|
||||||
|
private float _animationBlend;
|
||||||
|
private float _targetRotation = 0.0f;
|
||||||
|
private float _rotationVelocity;
|
||||||
|
private float _verticalVelocity;
|
||||||
|
private float _terminalVelocity = 53.0f;
|
||||||
|
|
||||||
|
// timeout deltatime
|
||||||
|
private float _jumpTimeoutDelta;
|
||||||
|
private float _fallTimeoutDelta;
|
||||||
|
|
||||||
|
// animation IDs
|
||||||
|
private int _animIDSpeed;
|
||||||
|
private int _animIDGrounded;
|
||||||
|
private int _animIDJump;
|
||||||
|
private int _animIDFreeFall;
|
||||||
|
private int _animIDMotionSpeed;
|
||||||
|
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
private PlayerInput _playerInput;
|
||||||
|
#endif
|
||||||
|
private Animator _animator;
|
||||||
|
private CharacterController _controller;
|
||||||
|
private StarterAssetsInputs _input;
|
||||||
|
private GameObject _mainCamera;
|
||||||
|
|
||||||
|
private const float _threshold = 0.01f;
|
||||||
|
|
||||||
|
private bool _hasAnimator;
|
||||||
|
|
||||||
|
private bool IsCurrentDeviceMouse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
return _playerInput.currentControlScheme == "KeyboardMouse";
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
// get a reference to our main camera
|
||||||
|
if (_mainCamera == null)
|
||||||
|
{
|
||||||
|
_mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_cinemachineTargetYaw = CinemachineCameraTarget.transform.rotation.eulerAngles.y;
|
||||||
|
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
_controller = GetComponent<CharacterController>();
|
||||||
|
_input = GetComponent<StarterAssetsInputs>();
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
_playerInput = GetComponent<PlayerInput>();
|
||||||
|
#else
|
||||||
|
Debug.LogError( "Starter Assets package is missing dependencies. Please use Tools/Starter Assets/Reinstall Dependencies to fix it");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
AssignAnimationIDs();
|
||||||
|
|
||||||
|
// reset our timeouts on start
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_hasAnimator = TryGetComponent(out _animator);
|
||||||
|
|
||||||
|
JumpAndGravity();
|
||||||
|
GroundedCheck();
|
||||||
|
Move();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
CameraRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AssignAnimationIDs()
|
||||||
|
{
|
||||||
|
_animIDSpeed = Animator.StringToHash("Speed");
|
||||||
|
_animIDGrounded = Animator.StringToHash("Grounded");
|
||||||
|
_animIDJump = Animator.StringToHash("Jump");
|
||||||
|
_animIDFreeFall = Animator.StringToHash("FreeFall");
|
||||||
|
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroundedCheck()
|
||||||
|
{
|
||||||
|
// set sphere position, with offset
|
||||||
|
Vector3 spherePosition = new Vector3(transform.position.x, transform.position.y - GroundedOffset,
|
||||||
|
transform.position.z);
|
||||||
|
Grounded = Physics.CheckSphere(spherePosition, GroundedRadius, GroundLayers,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDGrounded, Grounded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CameraRotation()
|
||||||
|
{
|
||||||
|
// if there is an input and camera position is not fixed
|
||||||
|
if (_input.look.sqrMagnitude >= _threshold && !LockCameraPosition)
|
||||||
|
{
|
||||||
|
//Don't multiply mouse input by Time.deltaTime;
|
||||||
|
float deltaTimeMultiplier = IsCurrentDeviceMouse ? 1.0f : Time.deltaTime;
|
||||||
|
|
||||||
|
_cinemachineTargetYaw += _input.look.x * deltaTimeMultiplier;
|
||||||
|
_cinemachineTargetPitch += _input.look.y * deltaTimeMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clamp our rotations so our values are limited 360 degrees
|
||||||
|
_cinemachineTargetYaw = ClampAngle(_cinemachineTargetYaw, float.MinValue, float.MaxValue);
|
||||||
|
_cinemachineTargetPitch = ClampAngle(_cinemachineTargetPitch, BottomClamp, TopClamp);
|
||||||
|
|
||||||
|
// Cinemachine will follow this target
|
||||||
|
CinemachineCameraTarget.transform.rotation = Quaternion.Euler(_cinemachineTargetPitch + CameraAngleOverride,
|
||||||
|
_cinemachineTargetYaw, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Move()
|
||||||
|
{
|
||||||
|
// set target speed based on move speed, sprint speed and if sprint is pressed
|
||||||
|
float targetSpeed = _input.sprint ? SprintSpeed : MoveSpeed;
|
||||||
|
|
||||||
|
// a simplistic acceleration and deceleration designed to be easy to remove, replace, or iterate upon
|
||||||
|
|
||||||
|
// note: Vector2's == operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is no input, set the target speed to 0
|
||||||
|
if (_input.move == Vector2.zero) targetSpeed = 0.0f;
|
||||||
|
|
||||||
|
// a reference to the players current horizontal velocity
|
||||||
|
float currentHorizontalSpeed = new Vector3(_controller.velocity.x, 0.0f, _controller.velocity.z).magnitude;
|
||||||
|
|
||||||
|
float speedOffset = 0.1f;
|
||||||
|
float inputMagnitude = _input.analogMovement ? _input.move.magnitude : 1f;
|
||||||
|
|
||||||
|
// accelerate or decelerate to target speed
|
||||||
|
if (currentHorizontalSpeed < targetSpeed - speedOffset ||
|
||||||
|
currentHorizontalSpeed > targetSpeed + speedOffset)
|
||||||
|
{
|
||||||
|
// creates curved result rather than a linear one giving a more organic speed change
|
||||||
|
// note T in Lerp is clamped, so we don't need to clamp our speed
|
||||||
|
_speed = Mathf.Lerp(currentHorizontalSpeed, targetSpeed * inputMagnitude,
|
||||||
|
Time.deltaTime * SpeedChangeRate);
|
||||||
|
|
||||||
|
// round speed to 3 decimal places
|
||||||
|
_speed = Mathf.Round(_speed * 1000f) / 1000f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_speed = targetSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
_animationBlend = Mathf.Lerp(_animationBlend, targetSpeed, Time.deltaTime * SpeedChangeRate);
|
||||||
|
if (_animationBlend < 0.01f) _animationBlend = 0f;
|
||||||
|
|
||||||
|
// normalise input direction
|
||||||
|
Vector3 inputDirection = new Vector3(_input.move.x, 0.0f, _input.move.y).normalized;
|
||||||
|
|
||||||
|
// note: Vector2's != operator uses approximation so is not floating point error prone, and is cheaper than magnitude
|
||||||
|
// if there is a move input rotate player when the player is moving
|
||||||
|
if (_input.move != Vector2.zero)
|
||||||
|
{
|
||||||
|
_targetRotation = Mathf.Atan2(inputDirection.x, inputDirection.z) * Mathf.Rad2Deg +
|
||||||
|
_mainCamera.transform.eulerAngles.y;
|
||||||
|
float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, _targetRotation, ref _rotationVelocity,
|
||||||
|
RotationSmoothTime);
|
||||||
|
|
||||||
|
// rotate to face input direction relative to camera position
|
||||||
|
transform.rotation = Quaternion.Euler(0.0f, rotation, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 targetDirection = Quaternion.Euler(0.0f, _targetRotation, 0.0f) * Vector3.forward;
|
||||||
|
|
||||||
|
// move the player
|
||||||
|
_controller.Move(targetDirection.normalized * (_speed * Time.deltaTime) +
|
||||||
|
new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetFloat(_animIDSpeed, _animationBlend);
|
||||||
|
_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void JumpAndGravity()
|
||||||
|
{
|
||||||
|
if (Grounded)
|
||||||
|
{
|
||||||
|
// reset the fall timeout timer
|
||||||
|
_fallTimeoutDelta = FallTimeout;
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, false);
|
||||||
|
_animator.SetBool(_animIDFreeFall, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop our velocity dropping infinitely when grounded
|
||||||
|
if (_verticalVelocity < 0.0f)
|
||||||
|
{
|
||||||
|
_verticalVelocity = -2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump
|
||||||
|
if (_input.jump && _jumpTimeoutDelta <= 0.0f)
|
||||||
|
{
|
||||||
|
// the square root of H * -2 * G = how much velocity needed to reach desired height
|
||||||
|
_verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity);
|
||||||
|
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDJump, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// jump timeout
|
||||||
|
if (_jumpTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_jumpTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// reset the jump timeout timer
|
||||||
|
_jumpTimeoutDelta = JumpTimeout;
|
||||||
|
|
||||||
|
// fall timeout
|
||||||
|
if (_fallTimeoutDelta >= 0.0f)
|
||||||
|
{
|
||||||
|
_fallTimeoutDelta -= Time.deltaTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// update animator if using character
|
||||||
|
if (_hasAnimator)
|
||||||
|
{
|
||||||
|
_animator.SetBool(_animIDFreeFall, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we are not grounded, do not jump
|
||||||
|
_input.jump = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply gravity over time if under terminal (multiply by delta time twice to linearly speed up over time)
|
||||||
|
if (_verticalVelocity < _terminalVelocity)
|
||||||
|
{
|
||||||
|
_verticalVelocity += Gravity * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float ClampAngle(float lfAngle, float lfMin, float lfMax)
|
||||||
|
{
|
||||||
|
if (lfAngle < -360f) lfAngle += 360f;
|
||||||
|
if (lfAngle > 360f) lfAngle -= 360f;
|
||||||
|
return Mathf.Clamp(lfAngle, lfMin, lfMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Color transparentGreen = new Color(0.0f, 1.0f, 0.0f, 0.35f);
|
||||||
|
Color transparentRed = new Color(1.0f, 0.0f, 0.0f, 0.35f);
|
||||||
|
|
||||||
|
if (Grounded) Gizmos.color = transparentGreen;
|
||||||
|
else Gizmos.color = transparentRed;
|
||||||
|
|
||||||
|
// when selected, draw a gizmo in the position of, and matching radius of, the grounded collider
|
||||||
|
Gizmos.DrawSphere(
|
||||||
|
new Vector3(transform.position.x, transform.position.y - GroundedOffset, transform.position.z),
|
||||||
|
GroundedRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFootstep(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (AudioFootsteps != null)
|
||||||
|
AudioFootsteps.Play();
|
||||||
|
if (AudioFoley != null)
|
||||||
|
AudioFoley.Play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnLand(AnimationEvent animationEvent)
|
||||||
|
{
|
||||||
|
if (animationEvent.animatorClipInfo.weight > 0.5f)
|
||||||
|
{
|
||||||
|
if (LandingAudio != null)
|
||||||
|
LandingAudio.Play();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "1.0",
|
|
||||||
"components": [
|
|
||||||
"Microsoft.VisualStudio.Workload.ManagedGame"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<Solution>
|
|
||||||
<Project Path="Assembly-CSharp.csproj" />
|
|
||||||
<Project Path="Assembly-CSharp-Editor.csproj" />
|
|
||||||
</Solution>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,14 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 052faaac586de48259a63d0c4782560b
|
|
||||||
ScriptedImporter:
|
|
||||||
internalIDToNameTable: []
|
|
||||||
externalObjects: {}
|
|
||||||
serializedVersion: 2
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3}
|
|
||||||
generateWrapperCode: 0
|
|
||||||
wrapperCodePath:
|
|
||||||
wrapperClassName:
|
|
||||||
wrapperCodeNamespace:
|
|
||||||
Binary file not shown.
@@ -1,137 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 8
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: New Material
|
|
||||||
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
|
||||||
m_Parent: {fileID: 0}
|
|
||||||
m_ModifiedSerializedProperties: 0
|
|
||||||
m_ValidKeywords: []
|
|
||||||
m_InvalidKeywords: []
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap:
|
|
||||||
RenderType: Opaque
|
|
||||||
disabledShaderPasses:
|
|
||||||
- MOTIONVECTORS
|
|
||||||
m_LockedProperties:
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BaseMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _SpecGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_Lightmaps:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_LightmapsInd:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_ShadowMasks:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Ints: []
|
|
||||||
m_Floats:
|
|
||||||
- _AddPrecomputedVelocity: 0
|
|
||||||
- _AlphaClip: 0
|
|
||||||
- _AlphaToMask: 0
|
|
||||||
- _Blend: 0
|
|
||||||
- _BlendModePreserveSpecular: 1
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _ClearCoatMask: 0
|
|
||||||
- _ClearCoatSmoothness: 0
|
|
||||||
- _Cull: 2
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailAlbedoMapScale: 1
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _DstBlendAlpha: 0
|
|
||||||
- _EnvironmentReflections: 1
|
|
||||||
- _GlossMapScale: 0
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 0
|
|
||||||
- _Metallic: 1
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.005
|
|
||||||
- _QueueOffset: 0
|
|
||||||
- _ReceiveShadows: 1
|
|
||||||
- _Smoothness: 0.719
|
|
||||||
- _SmoothnessTextureChannel: 0
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _SrcBlendAlpha: 1
|
|
||||||
- _Surface: 0
|
|
||||||
- _WorkflowMode: 1
|
|
||||||
- _XRMotionVectorsPass: 1
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _BaseColor: {r: 1, g: 0.824983, b: 0, a: 1}
|
|
||||||
- _Color: {r: 1, g: 0.824983, b: 0, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
|
||||||
m_BuildTextureStacks: []
|
|
||||||
m_AllowLocking: 1
|
|
||||||
--- !u!114 &1289706123521349751
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 11
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 0}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
|
||||||
version: 10
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: bf739c48a51448b40b5c18a13e64606c
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 57 KiB |
@@ -1,137 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 8
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: grau
|
|
||||||
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
|
||||||
m_Parent: {fileID: 0}
|
|
||||||
m_ModifiedSerializedProperties: 0
|
|
||||||
m_ValidKeywords: []
|
|
||||||
m_InvalidKeywords: []
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap:
|
|
||||||
RenderType: Opaque
|
|
||||||
disabledShaderPasses:
|
|
||||||
- MOTIONVECTORS
|
|
||||||
m_LockedProperties:
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BaseMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _SpecGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_Lightmaps:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_LightmapsInd:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_ShadowMasks:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Ints: []
|
|
||||||
m_Floats:
|
|
||||||
- _AddPrecomputedVelocity: 0
|
|
||||||
- _AlphaClip: 0
|
|
||||||
- _AlphaToMask: 0
|
|
||||||
- _Blend: 0
|
|
||||||
- _BlendModePreserveSpecular: 1
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _ClearCoatMask: 0
|
|
||||||
- _ClearCoatSmoothness: 0
|
|
||||||
- _Cull: 2
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailAlbedoMapScale: 1
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _DstBlendAlpha: 0
|
|
||||||
- _EnvironmentReflections: 1
|
|
||||||
- _GlossMapScale: 0
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 0
|
|
||||||
- _Metallic: 0.835
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.005
|
|
||||||
- _QueueOffset: 0
|
|
||||||
- _ReceiveShadows: 1
|
|
||||||
- _Smoothness: 0.668
|
|
||||||
- _SmoothnessTextureChannel: 0
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _SrcBlendAlpha: 1
|
|
||||||
- _Surface: 0
|
|
||||||
- _WorkflowMode: 1
|
|
||||||
- _XRMotionVectorsPass: 1
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _BaseColor: {r: 0.4641509, g: 0.4299964, b: 0.4299964, a: 1}
|
|
||||||
- _Color: {r: 0.4641509, g: 0.42999637, b: 0.42999637, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
|
||||||
m_BuildTextureStacks: []
|
|
||||||
m_AllowLocking: 1
|
|
||||||
--- !u!114 &39927878235175474
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 11
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 0}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
|
||||||
version: 10
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: a934a766971d4774c9bc6d4fa27df0e2
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 139 KiB |
@@ -1,137 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 8
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: rot
|
|
||||||
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
|
||||||
m_Parent: {fileID: 0}
|
|
||||||
m_ModifiedSerializedProperties: 0
|
|
||||||
m_ValidKeywords: []
|
|
||||||
m_InvalidKeywords: []
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap:
|
|
||||||
RenderType: Opaque
|
|
||||||
disabledShaderPasses:
|
|
||||||
- MOTIONVECTORS
|
|
||||||
m_LockedProperties:
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BaseMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _SpecGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_Lightmaps:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_LightmapsInd:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_ShadowMasks:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Ints: []
|
|
||||||
m_Floats:
|
|
||||||
- _AddPrecomputedVelocity: 0
|
|
||||||
- _AlphaClip: 0
|
|
||||||
- _AlphaToMask: 0
|
|
||||||
- _Blend: 0
|
|
||||||
- _BlendModePreserveSpecular: 1
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _ClearCoatMask: 0
|
|
||||||
- _ClearCoatSmoothness: 0
|
|
||||||
- _Cull: 2
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailAlbedoMapScale: 1
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _DstBlendAlpha: 0
|
|
||||||
- _EnvironmentReflections: 1
|
|
||||||
- _GlossMapScale: 0
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 0
|
|
||||||
- _Metallic: 1
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.005
|
|
||||||
- _QueueOffset: 0
|
|
||||||
- _ReceiveShadows: 1
|
|
||||||
- _Smoothness: 0.646
|
|
||||||
- _SmoothnessTextureChannel: 0
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _SrcBlendAlpha: 1
|
|
||||||
- _Surface: 0
|
|
||||||
- _WorkflowMode: 1
|
|
||||||
- _XRMotionVectorsPass: 1
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _BaseColor: {r: 1, g: 0, b: 0, a: 1}
|
|
||||||
- _Color: {r: 1, g: 0, b: 0, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
|
||||||
m_BuildTextureStacks: []
|
|
||||||
m_AllowLocking: 1
|
|
||||||
--- !u!114 &410969823840424883
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 11
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 0}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
|
||||||
version: 10
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: bb0df644eb730354a9108781119601a0
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 8
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: schwarz
|
|
||||||
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
|
||||||
m_Parent: {fileID: 0}
|
|
||||||
m_ModifiedSerializedProperties: 0
|
|
||||||
m_ValidKeywords:
|
|
||||||
- _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
|
|
||||||
m_InvalidKeywords: []
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap:
|
|
||||||
RenderType: Opaque
|
|
||||||
disabledShaderPasses:
|
|
||||||
- MOTIONVECTORS
|
|
||||||
m_LockedProperties:
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BaseMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _SpecGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_Lightmaps:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_LightmapsInd:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- unity_ShadowMasks:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Ints: []
|
|
||||||
m_Floats:
|
|
||||||
- _AddPrecomputedVelocity: 0
|
|
||||||
- _AlphaClip: 0
|
|
||||||
- _AlphaToMask: 0
|
|
||||||
- _Blend: 0
|
|
||||||
- _BlendModePreserveSpecular: 1
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _ClearCoatMask: 0
|
|
||||||
- _ClearCoatSmoothness: 0
|
|
||||||
- _Cull: 2
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailAlbedoMapScale: 1
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _DstBlendAlpha: 0
|
|
||||||
- _EnvironmentReflections: 1
|
|
||||||
- _GlossMapScale: 0
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 0
|
|
||||||
- _Metallic: 0
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.005
|
|
||||||
- _QueueOffset: 0
|
|
||||||
- _ReceiveShadows: 1
|
|
||||||
- _Smoothness: 0.321
|
|
||||||
- _SmoothnessTextureChannel: 1
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _SrcBlendAlpha: 1
|
|
||||||
- _Surface: 0
|
|
||||||
- _WorkflowMode: 1
|
|
||||||
- _XRMotionVectorsPass: 1
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _BaseColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _Color: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
|
||||||
m_BuildTextureStacks: []
|
|
||||||
m_AllowLocking: 1
|
|
||||||
--- !u!114 &4619355420189739995
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 11
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 0}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
|
||||||
version: 10
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 94507ccd4f290af47b3074def140aa5a
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 5a2611ddb1d3ec8429d681ce55dff8eb
|
guid: edab9217dbf4eb04ca5a988301ea40fc
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
|
|||||||
@@ -1,740 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!1 &402270611042455660
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 4994417827637223817}
|
|
||||||
- component: {fileID: 5782483642994092263}
|
|
||||||
- component: {fileID: 4375254989308069004}
|
|
||||||
- component: {fileID: 7166565373662720485}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Grib
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &4994417827637223817
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 402270611042455660}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0.7071063, y: -0, z: -0, w: 0.70710737}
|
|
||||||
m_LocalPosition: {x: 0.212, y: 0.6609516, z: 0.8317743}
|
|
||||||
m_LocalScale: {x: 0.25465748, y: 1.0098639, z: 0.1049136}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3945699778904299871}
|
|
||||||
m_LocalEulerAnglesHint: {x: 900, y: 0, z: 0}
|
|
||||||
--- !u!33 &5782483642994092263
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 402270611042455660}
|
|
||||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &4375254989308069004
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 402270611042455660}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 94507ccd4f290af47b3074def140aa5a, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!65 &7166565373662720485
|
|
||||||
BoxCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 402270611042455660}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 3
|
|
||||||
m_Size: {x: 1, y: 1, z: 1}
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &616760358415966690
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3358950876010158595}
|
|
||||||
- component: {fileID: 544493013632528032}
|
|
||||||
- component: {fileID: 1281095378038919116}
|
|
||||||
- component: {fileID: 536243226925001407}
|
|
||||||
- component: {fileID: 6577416588327676514}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Magazin
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &3358950876010158595
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 616760358415966690}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0.7343225, y: -0, z: -0, w: 0.67880076}
|
|
||||||
m_LocalPosition: {x: 0.212, y: 0.0055308715, z: 1.0134083}
|
|
||||||
m_LocalScale: {x: 0.17445877, y: 1.4734803, z: 0.17246339}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 8106650884638092069}
|
|
||||||
m_Father: {fileID: 3945699778904299871}
|
|
||||||
m_LocalEulerAnglesHint: {x: 94.5, y: 0, z: 0}
|
|
||||||
--- !u!33 &544493013632528032
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 616760358415966690}
|
|
||||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &1281095378038919116
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 616760358415966690}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 94507ccd4f290af47b3074def140aa5a, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!65 &536243226925001407
|
|
||||||
BoxCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 616760358415966690}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 3
|
|
||||||
m_Size: {x: 1, y: 1, z: 1}
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!95 &6577416588327676514
|
|
||||||
Animator:
|
|
||||||
serializedVersion: 7
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 616760358415966690}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_Avatar: {fileID: 0}
|
|
||||||
m_Controller: {fileID: 9100000, guid: d489640b78374334c842856c1704b741, type: 2}
|
|
||||||
m_CullingMode: 0
|
|
||||||
m_UpdateMode: 0
|
|
||||||
m_ApplyRootMotion: 0
|
|
||||||
m_LinearVelocityBlending: 0
|
|
||||||
m_StabilizeFeet: 0
|
|
||||||
m_AnimatePhysics: 0
|
|
||||||
m_WarningMessage:
|
|
||||||
m_HasTransformHierarchy: 1
|
|
||||||
m_AllowConstantClipSamplingOptimization: 1
|
|
||||||
m_KeepAnimatorStateOnDisable: 0
|
|
||||||
m_WriteDefaultValuesOnDisable: 0
|
|
||||||
--- !u!1 &1106370384454530052
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 2738580378295177801}
|
|
||||||
- component: {fileID: 8526056759557678377}
|
|
||||||
- component: {fileID: 382357218144423143}
|
|
||||||
- component: {fileID: 6333319151337256526}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Sphere
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &2738580378295177801
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0.7071068, y: -0, z: -0, w: 0.7071068}
|
|
||||||
m_LocalPosition: {x: 0, y: -0.52709705, z: 0}
|
|
||||||
m_LocalScale: {x: 0.9487386, y: 0.94873834, z: 2.2373555}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 8106650884638092069}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &8526056759557678377
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &382357218144423143
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: bf739c48a51448b40b5c18a13e64606c, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!135 &6333319151337256526
|
|
||||||
SphereCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 3
|
|
||||||
m_Radius: 0.5
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &1345163984726252992
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 8106650884638092069}
|
|
||||||
- component: {fileID: 2145416997532695745}
|
|
||||||
- component: {fileID: 365273443409107270}
|
|
||||||
- component: {fileID: 6757658965492992778}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Munition (1)
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &8106650884638092069
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0.70363355, y: -0, z: -0, w: 0.71056306}
|
|
||||||
m_LocalPosition: {x: 0.013612632, y: -0.4932232, z: -0.08104772}
|
|
||||||
m_LocalScale: {x: 0.5355531, y: 0.35106266, z: 0.06261455}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 2738580378295177801}
|
|
||||||
m_Father: {fileID: 3358950876010158595}
|
|
||||||
m_LocalEulerAnglesHint: {x: 95.061005, y: 0, z: 0}
|
|
||||||
--- !u!33 &2145416997532695745
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &365273443409107270
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: bf739c48a51448b40b5c18a13e64606c, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &6757658965492992778
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.5000001
|
|
||||||
m_Height: 2
|
|
||||||
m_Direction: 1
|
|
||||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
|
||||||
--- !u!1 &2419706330575798562
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 7448449092846401218}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Muzzle
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &7448449092846401218
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 2419706330575798562}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0.014, y: -2.133, z: 0.01}
|
|
||||||
m_LocalScale: {x: 0.7795448, y: 0.77954465, z: 0.27654868}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3945699778904299871}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &4628214535345608438
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 9091445594414695264}
|
|
||||||
- component: {fileID: 7497158803504024932}
|
|
||||||
- component: {fileID: 8029660888886616903}
|
|
||||||
- component: {fileID: 2794431915553054548}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Barrel
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &9091445594414695264
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4628214535345608438}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: -1.2527663, z: 0}
|
|
||||||
m_LocalScale: {x: 0.35653, y: 0.35652998, z: 0.35653007}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3945699778904299871}
|
|
||||||
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
|
|
||||||
--- !u!33 &7497158803504024932
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4628214535345608438}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &8029660888886616903
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4628214535345608438}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 94507ccd4f290af47b3074def140aa5a, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &2794431915553054548
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4628214535345608438}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.5000001
|
|
||||||
m_Height: 2
|
|
||||||
m_Direction: 1
|
|
||||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
|
||||||
--- !u!1 &5850548977863442861
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3945699778904299871}
|
|
||||||
- component: {fileID: 8402877828330663370}
|
|
||||||
- component: {fileID: 7626643092593118328}
|
|
||||||
- component: {fileID: 3896843066357607658}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: AR
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &3945699778904299871
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5850548977863442861}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 1.2828, y: 3.615999, z: 1.2828}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 3358950876010158595}
|
|
||||||
- {fileID: 4994417827637223817}
|
|
||||||
- {fileID: 9091445594414695264}
|
|
||||||
- {fileID: 7448449092846401218}
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &8402877828330663370
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5850548977863442861}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &7626643092593118328
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5850548977863442861}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 94507ccd4f290af47b3074def140aa5a, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &3896843066357607658
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5850548977863442861}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 1
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.5000001
|
|
||||||
m_Height: 2
|
|
||||||
m_Direction: 1
|
|
||||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!1 &4474395191186681843
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 9213651879391675335}
|
|
||||||
- component: {fileID: 311416782738170599}
|
|
||||||
- component: {fileID: 7836724661544455083}
|
|
||||||
- component: {fileID: 571913352886790723}
|
|
||||||
- component: {fileID: -6993605351751520713}
|
|
||||||
- component: {fileID: 8527849387968217228}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Bullet
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &9213651879391675335
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4474395191186681843}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 0.113710575, y: 0.113710575, z: 0.48566926}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &311416782738170599
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4474395191186681843}
|
|
||||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &7836724661544455083
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4474395191186681843}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: bf739c48a51448b40b5c18a13e64606c, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &571913352886790723
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4474395191186681843}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 1
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.50000006
|
|
||||||
m_Height: 1
|
|
||||||
m_Direction: 2
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!114 &-6993605351751520713
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4474395191186681843}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: 7ee40f80839af164b8507cf892937394, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier: Assembly-CSharp::Bullet
|
|
||||||
speed: 20
|
|
||||||
damage: 25
|
|
||||||
--- !u!54 &8527849387968217228
|
|
||||||
Rigidbody:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4474395191186681843}
|
|
||||||
serializedVersion: 5
|
|
||||||
m_Mass: 1
|
|
||||||
m_LinearDamping: 0
|
|
||||||
m_AngularDamping: 0.05
|
|
||||||
m_CenterOfMass: {x: 0, y: 0, z: 0}
|
|
||||||
m_InertiaTensor: {x: 1, y: 1, z: 1}
|
|
||||||
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ImplicitCom: 1
|
|
||||||
m_ImplicitTensor: 1
|
|
||||||
m_UseGravity: 0
|
|
||||||
m_IsKinematic: 0
|
|
||||||
m_Interpolate: 0
|
|
||||||
m_Constraints: 0
|
|
||||||
m_CollisionDetection: 0
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: c7fd2b64609ae0a4ba9c9021ccf720b7
|
guid: 9787e494c6ca47e439e2f813052adb38
|
||||||
PrefabImporter:
|
PrefabImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
|
|||||||
@@ -1,507 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!1 &738864077047456443
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 733193051989609528}
|
|
||||||
- component: {fileID: 4227408296677755046}
|
|
||||||
- component: {fileID: 6367430541660892840}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cylinder (4)
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &733193051989609528
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 738864077047456443}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: -1.0132104, z: 0}
|
|
||||||
m_LocalScale: {x: 1.0519265, y: 0.032622, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3443377065967229106}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &4227408296677755046
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 738864077047456443}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &6367430541660892840
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 738864077047456443}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: a934a766971d4774c9bc6d4fa27df0e2, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!1 &2570043017083923531
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 5309329364456148980}
|
|
||||||
- component: {fileID: 4444349846110520233}
|
|
||||||
- component: {fileID: 8637549995587995349}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cylinder (2)
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &5309329364456148980
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 2570043017083923531}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0.36310816, z: 0}
|
|
||||||
m_LocalScale: {x: 1.0519265, y: 0.032622, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3443377065967229106}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &4444349846110520233
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 2570043017083923531}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &8637549995587995349
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 2570043017083923531}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: a934a766971d4774c9bc6d4fa27df0e2, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!1 &3741033135399158742
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3089089005890824162}
|
|
||||||
- component: {fileID: 7939497695594466678}
|
|
||||||
- component: {fileID: 2252140058497073550}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cylinder (1)
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &3089089005890824162
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3741033135399158742}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0.97826844, z: 0}
|
|
||||||
m_LocalScale: {x: 1.0519265, y: 0.032622, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3443377065967229106}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &7939497695594466678
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3741033135399158742}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &2252140058497073550
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3741033135399158742}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: a934a766971d4774c9bc6d4fa27df0e2, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!1 &6882186007371796286
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 5148402464345762454}
|
|
||||||
- component: {fileID: 6674335637517849331}
|
|
||||||
- component: {fileID: 2323466925024237008}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cylinder (3)
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &5148402464345762454
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 6882186007371796286}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: -0.38820753, z: 0}
|
|
||||||
m_LocalScale: {x: 1.0519265, y: 0.032622, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3443377065967229106}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &6674335637517849331
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 6882186007371796286}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &2323466925024237008
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 6882186007371796286}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: a934a766971d4774c9bc6d4fa27df0e2, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!1 &8116765825148555274
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3443377065967229106}
|
|
||||||
- component: {fileID: 5231036744341335021}
|
|
||||||
- component: {fileID: 5548024854754847632}
|
|
||||||
- component: {fileID: 8950496761394082049}
|
|
||||||
- component: {fileID: 5988322702429402960}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: ExplosionFass
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &3443377065967229106
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8116765825148555274}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 1, y: 0.6095972, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 3089089005890824162}
|
|
||||||
- {fileID: 5309329364456148980}
|
|
||||||
- {fileID: 5148402464345762454}
|
|
||||||
- {fileID: 733193051989609528}
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &5231036744341335021
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8116765825148555274}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &5548024854754847632
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8116765825148555274}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: bb0df644eb730354a9108781119601a0, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!64 &8950496761394082049
|
|
||||||
MeshCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8116765825148555274}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 5
|
|
||||||
m_Convex: 1
|
|
||||||
m_CookingOptions: 30
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!54 &5988322702429402960
|
|
||||||
Rigidbody:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8116765825148555274}
|
|
||||||
serializedVersion: 5
|
|
||||||
m_Mass: 1
|
|
||||||
m_LinearDamping: 0
|
|
||||||
m_AngularDamping: 0.05
|
|
||||||
m_CenterOfMass: {x: 0, y: 0, z: 0}
|
|
||||||
m_InertiaTensor: {x: 1, y: 1, z: 1}
|
|
||||||
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ImplicitCom: 1
|
|
||||||
m_ImplicitTensor: 1
|
|
||||||
m_UseGravity: 1
|
|
||||||
m_IsKinematic: 0
|
|
||||||
m_Interpolate: 0
|
|
||||||
m_Constraints: 0
|
|
||||||
m_CollisionDetection: 0
|
|
||||||
@@ -1,261 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!1 &790623186319470878
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3225906274411375276}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Messer
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 0
|
|
||||||
--- !u!4 &3225906274411375276
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 790623186319470878}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 3538828083638879969}
|
|
||||||
- {fileID: 8802697862293512837}
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &5105879349500379703
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 8802697862293512837}
|
|
||||||
- component: {fileID: 3497449538278730575}
|
|
||||||
- component: {fileID: 1573235385774970186}
|
|
||||||
- component: {fileID: 449544984289342995}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cylinder
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &8802697862293512837
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5105879349500379703}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: -1.238, z: 0}
|
|
||||||
m_LocalScale: {x: 0.1354151, y: 0.49745, z: 0.24919179}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3225906274411375276}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &3497449538278730575
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5105879349500379703}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &1573235385774970186
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5105879349500379703}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &449544984289342995
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5105879349500379703}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.5000001
|
|
||||||
m_Height: 2
|
|
||||||
m_Direction: 1
|
|
||||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
|
||||||
--- !u!1 &8076742735439367972
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3538828083638879969}
|
|
||||||
- component: {fileID: 4393710059264695569}
|
|
||||||
- component: {fileID: 8236414346913779795}
|
|
||||||
- component: {fileID: 4211851575702925883}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cube
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &3538828083638879969
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8076742735439367972}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 0.105893984, y: 1.9132714, z: 0.45401}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 3225906274411375276}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &4393710059264695569
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8076742735439367972}
|
|
||||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &8236414346913779795
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8076742735439367972}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!65 &4211851575702925883
|
|
||||||
BoxCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8076742735439367972}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 1
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 3
|
|
||||||
m_Size: {x: 1, y: 1, z: 1}
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
@@ -1,229 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!1 &1106370384454530052
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 2738580378295177801}
|
|
||||||
- component: {fileID: 8526056759557678377}
|
|
||||||
- component: {fileID: 382357218144423143}
|
|
||||||
- component: {fileID: 6333319151337256526}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Sphere
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &2738580378295177801
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0.7071068, y: -0, z: -0, w: 0.7071068}
|
|
||||||
m_LocalPosition: {x: 0, y: -0.52709705, z: 0}
|
|
||||||
m_LocalScale: {x: 0.9487386, y: 0.94873834, z: 2.2373555}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 8106650884638092069}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!33 &8526056759557678377
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &382357218144423143
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: bf739c48a51448b40b5c18a13e64606c, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!135 &6333319151337256526
|
|
||||||
SphereCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1106370384454530052}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 3
|
|
||||||
m_Radius: 0.5
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &1345163984726252992
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 8106650884638092069}
|
|
||||||
- component: {fileID: 2145416997532695745}
|
|
||||||
- component: {fileID: 365273443409107270}
|
|
||||||
- component: {fileID: 6757658965492992778}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Munition
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &8106650884638092069
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 0.11985449, y: 0.21707286, z: 0.11985449}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 2738580378295177801}
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
|
|
||||||
--- !u!33 &2145416997532695745
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &365273443409107270
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: bf739c48a51448b40b5c18a13e64606c, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &6757658965492992778
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1345163984726252992}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.5000001
|
|
||||||
m_Height: 2
|
|
||||||
m_Direction: 1
|
|
||||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 90b20e4e64e852f4b8a3afd3e2e1c84b
|
|
||||||
PrefabImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,293 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!1 &3150477364047279588
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 2396971725620813859}
|
|
||||||
- component: {fileID: 6696152723858882624}
|
|
||||||
- component: {fileID: 913021639440286809}
|
|
||||||
- component: {fileID: 5463797310158899726}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Pistole
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &2396971725620813859
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3150477364047279588}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 1, z: 0, w: 0}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 0.62523, y: 0.62523, z: 2.5534475}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children:
|
|
||||||
- {fileID: 6127259917231396667}
|
|
||||||
- {fileID: 1292371226238404395}
|
|
||||||
- {fileID: 3761782979458803265}
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0}
|
|
||||||
--- !u!33 &6696152723858882624
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3150477364047279588}
|
|
||||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &913021639440286809
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3150477364047279588}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 94507ccd4f290af47b3074def140aa5a, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!65 &5463797310158899726
|
|
||||||
BoxCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3150477364047279588}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 3
|
|
||||||
m_Size: {x: 1, y: 1, z: 1}
|
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &3831243632405294257
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 3761782979458803265}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Muzzle
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &3761782979458803265
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 3831243632405294257}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: -0.7063}
|
|
||||||
m_LocalScale: {x: 1.5994115, y: 1.5994115, z: 0.3916274}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 2396971725620813859}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &4465938783623711180
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 1292371226238404395}
|
|
||||||
- component: {fileID: 2155911154980878813}
|
|
||||||
- component: {fileID: 3822509094202677073}
|
|
||||||
- component: {fileID: 118420963395475397}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cylinder
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &1292371226238404395
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4465938783623711180}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: -0.3810533}
|
|
||||||
m_LocalScale: {x: 0.64585334, y: 0.29063305, z: 0.6458534}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 2396971725620813859}
|
|
||||||
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
|
|
||||||
--- !u!33 &2155911154980878813
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4465938783623711180}
|
|
||||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &3822509094202677073
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4465938783623711180}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 94507ccd4f290af47b3074def140aa5a, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!136 &118420963395475397
|
|
||||||
CapsuleCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 4465938783623711180}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Radius: 0.5000001
|
|
||||||
m_Height: 2
|
|
||||||
m_Direction: 1
|
|
||||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
|
||||||
--- !u!1 &6168136869709037227
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 6127259917231396667}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Cube
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &6127259917231396667
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 6168136869709037227}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 2396971725620813859}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: a0abf67d2f77de14aba69a9826c206df
|
|
||||||
PrefabImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
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