first commit
This commit is contained in:
204
Assets/Scripts/Asrtronaut/AstronautController.cs
Normal file
204
Assets/Scripts/Asrtronaut/AstronautController.cs
Normal file
@@ -0,0 +1,204 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using TMPro;
|
||||
|
||||
public class AstronautController : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private float _moveSpeed = 3f;
|
||||
[SerializeField] private float _jumpForce = 10f;
|
||||
[SerializeField] private Planet _currentPlanet = Planet.Earth;
|
||||
[SerializeField] private AstronautAnimator _astronautAnimator;
|
||||
[SerializeField] private TextMeshProUGUI _planetText;
|
||||
[SerializeField] private TextMeshProUGUI _gravityText;
|
||||
public Planet CurrentPlanet => _currentPlanet;
|
||||
|
||||
public enum Planet
|
||||
{
|
||||
Mercury, Venus, Earth, Moon, Mars, Jupiter, Saturn, Uranus, Neptune, Sun
|
||||
}
|
||||
|
||||
private Rigidbody _rb;
|
||||
private bool _isGrounded;
|
||||
private bool _isJumping;
|
||||
private float _ratio = 1f;
|
||||
|
||||
float GetGravity(Planet planet)
|
||||
{
|
||||
switch (planet)
|
||||
{
|
||||
case Planet.Mercury: return 3.72f;
|
||||
case Planet.Venus: return 8.87f;
|
||||
case Planet.Earth: return 9.81f;
|
||||
case Planet.Moon: return 1.62f;
|
||||
case Planet.Mars: return 3.721f;
|
||||
case Planet.Jupiter: return 24.79f;
|
||||
case Planet.Saturn: return 10.44f;
|
||||
case Planet.Uranus: return 8.69f;
|
||||
case Planet.Neptune: return 11.15f;
|
||||
case Planet.Sun: return 274f;
|
||||
default: return 9.81f;
|
||||
}
|
||||
}
|
||||
|
||||
string GetPlanetNameUA(Planet planet)
|
||||
{
|
||||
switch (planet)
|
||||
{
|
||||
case Planet.Mercury: return "Меркурій";
|
||||
case Planet.Venus: return "Венера";
|
||||
case Planet.Earth: return "Земля";
|
||||
case Planet.Moon: return "Місяць";
|
||||
case Planet.Mars: return "Марс";
|
||||
case Planet.Jupiter: return "Юпітер";
|
||||
case Planet.Saturn: return "Сатурн";
|
||||
case Planet.Uranus: return "Уран";
|
||||
case Planet.Neptune: return "Нептун";
|
||||
case Planet.Sun: return "Сонце";
|
||||
default: return "";
|
||||
}
|
||||
}
|
||||
|
||||
float GetSpeedMultiplier()
|
||||
{
|
||||
if (_currentPlanet == Planet.Moon) return 1.5f;
|
||||
return Mathf.Clamp(1f / (_ratio * 1.5f), 0.15f, 3f);
|
||||
}
|
||||
|
||||
void ApplyGravity()
|
||||
{
|
||||
Physics.gravity = new Vector3(0, -GetGravity(_currentPlanet), 0);
|
||||
_ratio = GetGravity(_currentPlanet) / 9.81f;
|
||||
_astronautAnimator.SetRatio(_ratio);
|
||||
if (_planetText != null)
|
||||
_planetText.text = GetPlanetNameUA(_currentPlanet);
|
||||
}
|
||||
|
||||
IEnumerator ShowGravityText()
|
||||
{
|
||||
_gravityText.text = "Прискорення падіння: " + GetGravity(_currentPlanet).ToString("F2") + " м/с²";
|
||||
float t = 0f;
|
||||
while (t < 1f)
|
||||
{
|
||||
t += Time.deltaTime * 2f;
|
||||
_gravityText.alpha = t;
|
||||
yield return null;
|
||||
}
|
||||
yield return new WaitForSeconds(4f);
|
||||
t = 1f;
|
||||
while (t > 0f)
|
||||
{
|
||||
t -= Time.deltaTime * 2f;
|
||||
_gravityText.alpha = t;
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
|
||||
float GetClampedMass()
|
||||
{
|
||||
return Mathf.Clamp(_rb.mass, 30f, 100f);
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
_rb = GetComponent<Rigidbody>();
|
||||
_rb.freezeRotation = true;
|
||||
if (_gravityText != null)
|
||||
_gravityText.alpha = 0f;
|
||||
ApplyGravity();
|
||||
_astronautAnimator.SetMass(GetClampedMass());
|
||||
}
|
||||
|
||||
public void RefreshMass()
|
||||
{
|
||||
_astronautAnimator.SetMass(GetClampedMass());
|
||||
}
|
||||
|
||||
void OnCollisionEnter(Collision collision)
|
||||
{
|
||||
if (collision.gameObject.CompareTag("Ground"))
|
||||
{
|
||||
_isGrounded = true;
|
||||
_isJumping = false;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCollisionExit(Collision collision)
|
||||
{
|
||||
if (collision.gameObject.CompareTag("Ground"))
|
||||
{
|
||||
_isGrounded = false;
|
||||
}
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Alpha1)) { _currentPlanet = Planet.Mercury; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha2)) { _currentPlanet = Planet.Venus; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha3)) { _currentPlanet = Planet.Earth; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha4)) { _currentPlanet = Planet.Moon; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha5)) { _currentPlanet = Planet.Mars; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha6)) { _currentPlanet = Planet.Jupiter; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha7)) { _currentPlanet = Planet.Saturn; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha8)) { _currentPlanet = Planet.Uranus; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha9)) { _currentPlanet = Planet.Neptune; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Alpha0)) { _currentPlanet = Planet.Sun; ApplyGravity(); }
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Keypad1)) { _currentPlanet = Planet.Mercury; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad2)) { _currentPlanet = Planet.Venus; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad3)) { _currentPlanet = Planet.Earth; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad4)) { _currentPlanet = Planet.Moon; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad5)) { _currentPlanet = Planet.Mars; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad6)) { _currentPlanet = Planet.Jupiter; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad7)) { _currentPlanet = Planet.Saturn; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad8)) { _currentPlanet = Planet.Uranus; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad9)) { _currentPlanet = Planet.Neptune; ApplyGravity(); }
|
||||
if (Input.GetKeyDown(KeyCode.Keypad0)) { _currentPlanet = Planet.Sun; ApplyGravity(); }
|
||||
|
||||
float currentSpeed = _moveSpeed * GetSpeedMultiplier();
|
||||
float h = Input.GetAxis("Horizontal");
|
||||
float v = Input.GetAxis("Vertical");
|
||||
bool isWalking = Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f;
|
||||
|
||||
if (!_isJumping)
|
||||
{
|
||||
Vector3 move = new Vector3(-h, 0, -v).normalized * currentSpeed;
|
||||
_rb.velocity = new Vector3(move.x, _rb.velocity.y, move.z);
|
||||
if (isWalking)
|
||||
transform.forward = new Vector3(-h, 0, -v).normalized;
|
||||
}
|
||||
|
||||
_astronautAnimator.SetWalking(isWalking && !_isJumping);
|
||||
|
||||
bool canJump = _currentPlanet == Planet.Sun ? true : (_isGrounded && !_isJumping);
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Space) && canJump)
|
||||
{
|
||||
_isJumping = true;
|
||||
_astronautAnimator.Jump();
|
||||
StartCoroutine(JumpForceDelay());
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerator JumpForceDelay()
|
||||
{
|
||||
float animSpeed = (_currentPlanet == Planet.Moon)
|
||||
? 1.5f
|
||||
: Mathf.Clamp(1f / (_ratio * 1.5f), 0.15f, 3f);
|
||||
float delay = 0.7f / animSpeed;
|
||||
yield return new WaitForSeconds(delay);
|
||||
_rb.velocity = new Vector3(_rb.velocity.x, 0, _rb.velocity.z);
|
||||
float clampedMass = GetClampedMass();
|
||||
float savedMass = _rb.mass;
|
||||
_rb.mass = 75f;
|
||||
_rb.AddForce(Vector3.up * _jumpForce, ForceMode.Impulse);
|
||||
_rb.mass = savedMass;
|
||||
float bonus = Mathf.Lerp(1.5f, -1.5f, Mathf.InverseLerp(30f, 100f, clampedMass));
|
||||
_rb.AddForce(Vector3.up * bonus, ForceMode.VelocityChange);
|
||||
if (_gravityText != null)
|
||||
StartCoroutine(ShowGravityText());
|
||||
if (_currentPlanet == Planet.Sun)
|
||||
_isJumping = false;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user