GameVsJam/3d Prototyp/Assets/Scripts/Character.cs

268 lines
7.5 KiB
C#
Raw Normal View History

using System.Collections;
using System.Collections.Generic;
2024-04-07 00:09:53 +02:00
using Data;
using Interaction;
2024-04-07 12:39:05 +02:00
using TMPro.Examples;
2024-04-08 12:00:48 +02:00
using Unity.VisualScripting;
using UnityEngine;
2024-04-07 00:09:53 +02:00
using UnityEngine.Events;
using UnityEngine.EventSystems;
2024-04-07 00:58:57 +02:00
using UnityEngine.InputSystem;
2024-04-07 00:09:53 +02:00
using UnityEngine.Serialization;
using Utility;
public class Character : MonoBehaviour
{
2024-04-08 12:00:48 +02:00
[SerializeField] private Animator _animator;
[FormerlySerializedAs("moveSpeed")] [Header("Movement")]
public float _movementAcceleration = 2f;
public float groundDrag = 1f;
private Vector3 moveDirection;
private Rigidbody rb;
2024-04-08 12:00:48 +02:00
[FormerlySerializedAs("speed")] public float _maxVelocity = 2f;
2024-04-05 18:37:40 +02:00
[Header("Turning")]
public float turningRate = 30f;
public Quaternion _targetRotation = Quaternion.identity;
2024-04-08 12:00:48 +02:00
[Header("Jumping")]
public float jumpForce;
public float jumpCooldown;
2024-04-08 12:00:48 +02:00
private bool _readyToJump = true;
[Header("Groud Check")]
2024-04-08 12:00:48 +02:00
[SerializeField]private float _groundedTolerance = 0.2f;
[SerializeField]private LayerMask _groundLayerMask;
private bool _grounded;
2024-04-06 18:08:54 +02:00
[Header("Hold item")]
[SerializeField] private Transform _hand;
2024-04-07 00:09:53 +02:00
[FormerlySerializedAs("_carriedItem")] [SerializeField] private GameObject _carriedItemModel;
[SerializeField] private PickupInteractible _carriedInteractible;
[FormerlySerializedAs("_throwAsideForce")] [SerializeField, Tooltip("Die Kraft mit der der Gegenstand fallen gelassen wird.")]
private float _dropItemForce = 3.0f;
[SerializeField]
private GottfriedData _data;
[SerializeField]
private AudioSource _audioSource;
2024-04-08 12:00:48 +02:00
private static readonly int RunSpeed = Animator.StringToHash("RunSpeed");
private static readonly int IsFalling = Animator.StringToHash("IsFalling");
private static readonly int IsJumping = Animator.StringToHash("IsJumping");
2024-04-07 00:09:53 +02:00
public bool CarriesItem => _carriedInteractible;
public PickupInteractible CarriedItem => _carriedInteractible;
2024-04-06 18:08:54 +02:00
// Start is called before the first frame update
void Start()
{
rb = gameObject.GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
2024-04-08 12:00:48 +02:00
_grounded = Physics.Raycast(transform.position + new Vector3(0, _groundedTolerance / 2.0f, 0), Vector3.down, _groundedTolerance, _groundLayerMask);
SpeedControl();
2024-04-05 18:37:40 +02:00
transform.rotation = Quaternion.RotateTowards(transform.rotation, _targetRotation, turningRate * Time.deltaTime);
2024-04-08 12:00:48 +02:00
if (_grounded)
{
rb.drag = groundDrag;
}
else
{
rb.drag = 0.3f;
}
2024-04-08 12:00:48 +02:00
UpdateAnimator();
}
private void UpdateAnimator()
{
//if (_grounded)
{
Vector3 velocity = rb.velocity;
velocity.y = 0.0f;
_animator.SetFloat(RunSpeed, velocity.magnitude);
}
//else
{
//_animator.SetFloat(RunSpeed, 0);
}
_animator.SetBool(IsFalling, !_grounded);
}
2024-04-07 00:09:53 +02:00
public void PickupItem(PickupInteractible itemToPickup)
2024-04-06 18:08:54 +02:00
{
2024-04-07 00:14:00 +02:00
if (_carriedInteractible)
2024-04-06 18:08:54 +02:00
{
2024-04-07 00:09:53 +02:00
_carriedInteractible.gameObject.SetActive(true);
_carriedInteractible.transform.parent = null;
2024-04-06 18:08:54 +02:00
2024-04-07 00:09:53 +02:00
_carriedInteractible.transform.position = _carriedItemModel.transform.position;
_carriedInteractible.transform.rotation = _carriedItemModel.transform.rotation;
2024-04-06 18:08:54 +02:00
2024-04-07 00:09:53 +02:00
Rigidbody rigidbody = _carriedInteractible.GetComponent<Rigidbody>();
2024-04-06 18:08:54 +02:00
2024-04-07 00:09:53 +02:00
rigidbody.AddForce(Random.insideUnitSphere * _dropItemForce, ForceMode.Impulse);
2024-04-06 18:08:54 +02:00
2024-04-07 00:09:53 +02:00
Destroy(_carriedItemModel);
2024-04-06 18:08:54 +02:00
2024-04-07 00:09:53 +02:00
_carriedItemModel = null;
_carriedInteractible = null;
2024-04-06 18:08:54 +02:00
}
if (itemToPickup)
{
GameObject model = Instantiate(itemToPickup.Model, _hand);
itemToPickup.transform.parent = model.transform;
itemToPickup.gameObject.SetActive(false);
2024-04-07 00:14:00 +02:00
_carriedItemModel = model;
2024-04-07 00:09:53 +02:00
_carriedInteractible = itemToPickup;
2024-04-06 18:08:54 +02:00
}
}
private void FixedUpdate()
{
MovePlayer();
}
2024-04-07 00:58:57 +02:00
public void DoMove(InputAction.CallbackContext context)
{
2024-04-07 00:58:57 +02:00
Vector2 movement = context.ReadValue<Vector2>();
2024-04-08 12:00:48 +02:00
moveDirection = new Vector3(movement.x, 0, movement.y);
if(moveDirection.x != 0f || moveDirection.z != 0f)
2024-04-05 18:37:40 +02:00
{
2024-04-08 16:43:05 +02:00
_targetRotation = Quaternion.LookRotation(moveDirection);
//Quaternion.Euler(new Vector3(0f, Mathf.Atan2(moveDirection.x, moveDirection.z) * Mathf.Rad2Deg, 0f));
2024-04-05 18:37:40 +02:00
}
2024-04-07 00:58:57 +02:00
}
public void DoJump(InputAction.CallbackContext context)
{
2024-04-08 12:00:48 +02:00
if (!context.performed || !_readyToJump || !_grounded)
2024-04-07 00:58:57 +02:00
return;
2024-04-05 18:37:40 +02:00
2024-04-07 00:58:57 +02:00
Jump();
2024-04-07 00:58:57 +02:00
Invoke(nameof(ResetJump), jumpCooldown);
}
2024-04-07 00:58:57 +02:00
public void DoDropItem(InputAction.CallbackContext context)
{
if (!context.performed)
return;
PickupItem(null);
}
private void MovePlayer()
{
2024-04-08 12:00:48 +02:00
rb.AddForce(moveDirection.normalized * _movementAcceleration, ForceMode.Acceleration);
}
private void SpeedControl()
{
Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
2024-04-08 12:00:48 +02:00
if (flatVel.magnitude > _maxVelocity)
{
2024-04-08 12:00:48 +02:00
Vector3 limitedVel = flatVel.normalized * _maxVelocity;
rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z);
}
}
private void Jump()
{
2024-04-08 12:00:48 +02:00
_animator.SetTrigger(IsJumping);
rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
}
private void ResetJump()
{
2024-04-08 12:00:48 +02:00
_readyToJump = true;
}
2024-04-07 00:09:53 +02:00
public void GiveItemTo(Developer developer)
{
Debug.Log($"Gebe {_carriedInteractible.Name} an {developer.Name}");
2024-04-07 00:58:57 +02:00
2024-04-07 12:39:05 +02:00
PickupInteractible item = _carriedInteractible;
if (item == null)
return;
2024-04-07 00:09:53 +02:00
2024-04-07 12:39:05 +02:00
switch (item.ItemType)
{
case ItemType.Coffee:
2024-04-09 01:17:44 +02:00
developer.GiveDrink(0.45, WantedConsumable.Coffee);
_audioSource.PlayOneShot(_data.DrinkCoffe);
2024-04-07 12:39:05 +02:00
break;
case ItemType.Mate:
2024-04-09 01:17:44 +02:00
developer.GiveDrink(0.35, WantedConsumable.Mate);
_audioSource.PlayOneShot(_data.DrinkMate);
2024-04-07 12:39:05 +02:00
break;
case ItemType.Pizza:
2024-04-09 01:17:44 +02:00
developer.GiveFood(0.4, WantedConsumable.Pizza);
_audioSource.PlayOneShot(_data.EatPizza);
2024-04-07 12:39:05 +02:00
break;
2024-04-07 18:28:23 +02:00
default:
SayItsImpossible();
return;
2024-04-07 12:39:05 +02:00
}
item.UsesLeft--;
if (item.UsesLeft <= 0)
{
PickupItem(null);
2024-04-07 00:58:57 +02:00
2024-04-07 12:39:05 +02:00
Destroy(item.gameObject);
}
2024-04-07 00:09:53 +02:00
}
public void SayItsImpossible()
{
_audioSource.PlayOneShot(_data.VoiceSayItsImpossible.GetRandomElement());
}
2024-04-09 01:17:44 +02:00
[SerializeField]
private bool _canHurt = true;
public void Hurt()
{
if (_canHurt)
StartCoroutine(HurtRoutine());
}
private IEnumerator HurtRoutine()
{
_canHurt = false;
_audioSource.PlayOneShot(_data.Hurt);
PickupItem(null);
yield return new WaitForSeconds(1);
_canHurt = true;
}
}