Files
pogo-stick-game/Assets/TestScript2.cs
ondroftw db68e40251 Add ZeroFriction material and Pump object to scene
- Introduce `ZeroFriction` physics material for use in the scene.
- Add `Pump` GameObject with various components, including Rigidbody, CapsuleCollider, and MeshRenderer.
- Add configurable joint connecting `Upper` object and `Pump`.
- Update `SampleScene` with new objects and configurations for physics interactions.
2025-10-15 19:59:56 +02:00

194 lines
5.1 KiB
C#

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
public class TestScript2 : MonoBehaviour
{
private Rigidbody _rigidbody;
private InputAction _moveAction;
private InputAction _jumpAction;
private ConfigurableJoint _configurableJoint;
private float _smoothX;
// max is 0.63
// min is 0.15
private JointDrive _jointDrive;
private JointDrive _softJointDrive;
private double _maxDifference = 0;
private double _initDifference = 0;
private bool _grounded = false;
private bool _jumpQueued = false;
private bool _upJumpQueued = false;
private bool _canJump = false;
private bool _jumpInputBuffer = false;
private double? _previousDifference = null;
[SerializeField]
private float torqueForce;
[SerializeField]
private float lerpSpeed;
[SerializeField]
private float jumpDownForce = 1f;
[SerializeField]
private float jumpUpForce = 1f;
[SerializeField]
private float softPositionSpring = 200;
[SerializeField]
private ForceMode forceMode = ForceMode.Impulse;
[SerializeField]
private Rigidbody pump;
[SerializeField]
private DebugUi debugUi;
[SerializeField]
private float timeScale = 1f;
[SerializeField]
private bool lerp = true;
private float _startAngularDamp;
private void Awake()
{
_rigidbody = GetComponent<Rigidbody>();
_configurableJoint = GetComponent<ConfigurableJoint>();
_jointDrive = _configurableJoint.yDrive;
_softJointDrive = new JointDrive {
positionSpring = softPositionSpring,
maximumForce = _jointDrive.maximumForce,
positionDamper = _jointDrive.positionDamper,
useAcceleration = _jointDrive.useAcceleration
};
}
private void Start()
{
_moveAction = InputSystem.actions.FindAction("Move");
_jumpAction = InputSystem.actions.FindAction("Jump");
_moveAction.Enable();
_jumpAction.Enable();
_maxDifference = GetDifference();
_initDifference = _maxDifference;
debugUi?.UpdateText($"Difference: {_maxDifference}");
_startAngularDamp = _rigidbody.angularDamping;
Time.timeScale = timeScale;
}
private double GetDifference()
{
Vector3 axis = transform.up; // this transform's local Y in world space
Vector3 toOther = pump.transform.position - transform.position;
var val = Vector3.Dot(toOther, axis);
val = Mathf.Abs(val);
return Math.Round(val, 2); // signed distance along local Y
}
private void Jump()
{
float t = Mathf.InverseLerp(0.15f, 0.63f, (float)_maxDifference); // gives 0 when 0.63, 1 when 0.15
float forceMultiplier = Mathf.Lerp(30, 5, t);
_maxDifference = _initDifference;
_previousDifference = null;
_jumpQueued = false;
_canJump = false;
pump.AddForce(transform.up * (jumpUpForce * forceMultiplier), ForceMode.Impulse);
_configurableJoint.yDrive = _jointDrive;
}
private void Update()
{
var moveValue = _moveAction.ReadValue<Vector2>();
if (moveValue.x != 0) {
_smoothX = lerp ? Mathf.Lerp(_smoothX, moveValue.x, Time.deltaTime * lerpSpeed) : moveValue.x;
} else {
_smoothX = 0;
}
if (_jumpAction.WasPressedThisFrame() && !_jumpInputBuffer) {
_jumpInputBuffer = true;
StartCoroutine(JumpInputBuffer());
}
if (_jumpInputBuffer && _grounded) {
_jumpInputBuffer = false;
_jumpQueued = true;
}
if (_jumpQueued) {
if (GetDifference() < _maxDifference) {
_maxDifference = GetDifference();
}
_previousDifference ??= GetDifference();
if (_previousDifference < GetDifference() || _canJump) {
_canJump = true;
} else {
_previousDifference = GetDifference();
}
}
}
IEnumerator JumpInputBuffer()
{
yield return new WaitForSeconds(0.2f);
_jumpInputBuffer = false;
}
private void FixedUpdate()
{
// inverted to apply correct direction
_rigidbody.AddTorque(new Vector3(0, 0, -_smoothX) * torqueForce, forceMode);
if (_jumpQueued) {
_rigidbody.AddForce(-transform.up * jumpDownForce, ForceMode.Impulse);
}
if (_canJump && _grounded) {
Jump();
}
var origin = pump.position;
var dir = -pump.transform.up; // world down
const float distance = .40f;
if (Physics.Raycast(origin, dir, out var hit, distance)) {
Debug.DrawRay(origin, dir * hit.distance, Color.yellow);
_grounded = true;
} else {
Debug.DrawRay(origin, dir * distance, Color.white);
_grounded = false;
}
}
}