Unity_lab3/Unity3_lab/Assets/Scripts/PendulumHammer.cs

60 lines
2.8 KiB
C#

using UnityEngine;
public class PendulumHammer : MonoBehaviour
{
[Header("Настройки Маятника")]
[SerializeField] private float speed = 2.0f; // Скорость качания
[SerializeField] private float angleLimit = 75.0f; // Максимальный угол отклонения (амплитуда)
[SerializeField] private float startOffset = 0.0f; // Чтобы молотки качались не синхронно (0.5, 1.0 и т.д.)
[Header("Настройки Удара")]
[SerializeField] private float knockbackForce = 30f; // Сила отбрасывания
[SerializeField] private float upwardsModifier = 5f; // Насколько сильно подбрасывать вверх (0-1)
private Quaternion startRotation;
void Start()
{
// Запоминаем начальный поворот "пивота"
startRotation = transform.rotation;
}
void Update()
{
// Формула маятника: Sin(время * скорость) * угол
float angle = Mathf.Sin((Time.time + startOffset) * speed) * angleLimit;
// Вращаем вокруг оси X, чтобы движение было в плоскости Z (вперед-назад)
// Если нужно качание влево-вправо, замените на: Quaternion.Euler(0, 0, angle)
transform.rotation = startRotation * Quaternion.Euler(0, 0, angle);
}
private void OnCollisionEnter(Collision collision)
{
// Проверяем, попал ли молоток в игрока
BallController player = collision.gameObject.GetComponent<BallController>();
if (player != null)
{
Rigidbody playerRb = player.GetComponent<Rigidbody>();
if (playerRb != null)
{
// 1. Вычисляем направление удара: от центра молотка к шарику
// Используем contact point для точности, или просто позиции объектов
Vector3 hitDirection = (collision.transform.position - transform.position).normalized;
// Добавляем немного вектора "вверх", чтобы шарик не вбивало в пол
hitDirection.y += upwardsModifier;
hitDirection.Normalize();
// 2. Сбрасываем текущую скорость шарика, чтобы удар чувствовался резко
playerRb.linearVelocity = Vector3.zero;
// 3. Применяем импульс
playerRb.AddForce(hitDirection * knockbackForce, ForceMode.Impulse);
Debug.Log("Бонк!");
}
}
}
}