60 lines
2.8 KiB
C#
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("Бонк!");
|
|
}
|
|
}
|
|
}
|
|
} |