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(); if (player != null) { Rigidbody playerRb = player.GetComponent(); 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("Бонк!"); } } } }