Как правильно наносить урон?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно наносить урон?

Сообщение Anonymous »

Я пытаюсь нанести урон своему игроку, когда враг находится на заданном расстоянии, но что бы я ни пытался, жизнь игрока мгновенно обращается в 0. Я попытался добавить StartCoroutine(ReduceHealthOverTime()); строка в скрипте плеера и ползунок и здоровье прекрасно уменьшаются. Я тоже пробовал разные подходы, но результат всегда один и тот же.
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class PlayerHealth : MonoBehaviour
{
[SerializeField] private float maxHealth = 100f;
[SerializeField] private float currentHealth = 100f;
[SerializeField] private Slider healthSlider;

private void Awake()
{
// Initialize health
currentHealth = maxHealth;

// Configure the slider
if (healthSlider != null)
{
healthSlider.minValue = 0f;
healthSlider.maxValue = 1f;
UpdateHealthUI();
}

// Start the coroutine to remove 1 health every second
//StartCoroutine(ReduceHealthOverTime());
}

public void SetHealth(float health)
{
currentHealth = Mathf.Clamp(health, 0f, maxHealth);
UpdateHealthUI();
}

public void TakeDamage(float damage)
{
Debug.Log($"Before damage: Health = {currentHealth}, Damage = {damage}");
currentHealth = Mathf.Max(0f, currentHealth - damage);
Debug.Log($"After damage: Health = {currentHealth}");
UpdateHealthUI();
}

public void Heal(float amount)
{
currentHealth = Mathf.Min(maxHealth, currentHealth + amount);
UpdateHealthUI();
}

private void UpdateHealthUI()
{
if (healthSlider != null)
{
// Convert current health to 0-1 range for the slider
healthSlider.value = currentHealth / maxHealth;
}

// Log the current health to see if slider is working
Debug.Log("Current Health: " + currentHealth + " (Slider Value: " + (healthSlider != null ? healthSlider.value.ToString() : "No Slider") + ")");
}

// Coroutine to reduce health by 1 every second
private IEnumerator ReduceHealthOverTime()
{
while (currentHealth > 0)
{
yield return new WaitForSeconds(1f);
TakeDamage(1f);
}
}

// Getters for current and max health
public float GetCurrentHealth() => currentHealth;
public float GetMaxHealth() => maxHealth;
}

using UnityEngine;
using Assets.FantasyMonsters.Common.Scripts;
using System.Collections;

public class EnemyMovement : MonoBehaviour
{
[Header("Movement Settings")]
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private float baseStopDistance = 5f;
[SerializeField] private float stopDistanceVariation = 1.5f;
[SerializeField] private bool faceMovementDirection = true;

[Header("Attack Settings")]
[SerializeField] private float attackCooldown = 2f;
[SerializeField] private float normalAttackDamage = 10f;
[SerializeField] private float altAttackDamage = 20f;

[Header("References")]
[SerializeField] private Transform player;
[SerializeField] private bool debugMode = true;

private float actualStopDistance;
private Monster monsterScript;
private Animator animator;
private PlayerHealth playerHealth;
private bool canAttack = true;

private void Start()
{
// Initialize stop distance with random variation
actualStopDistance = baseStopDistance + Random.Range(-stopDistanceVariation, stopDistanceVariation);

// Get required components
monsterScript = GetComponent();
animator = GetComponent();

// Set up player reference and health component
if (player != null)
{
playerHealth = player.GetComponent();
if (playerHealth == null && debugMode)
{
Debug.LogError("PlayerHealth component not found on player!");
}
}

// Check for required components
if (monsterScript == null && debugMode)
{
Debug.LogError("Monster component not found on enemy!");
}
if (animator == null && debugMode)
{
Debug.LogError("Animator component not found on enemy!");
}
}

private void Update()
{
if (player == null) return;

float distanceToPlayer = Vector3.Distance(transform.position, player.position);

if (distanceToPlayer > actualStopDistance)
{
// Move towards player
transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);

// Handle rotation
if (faceMovementDirection)
{
transform.rotation = Quaternion.Euler(0, -90, 0);
}

// Update animation state
monsterScript?.SetState(MonsterState.Walk);

// Reset attack animation
if (animator != null)
{
animator.ResetTrigger("Attack");
}
}
else
{
// When in range, stop and attack
monsterScript?.SetState(MonsterState.Idle);

// Only try to attack if we can
if (canAttack && playerHealth != null)
{
StartCoroutine(Attack());
}
}

if (debugMode)
{
Debug.DrawLine(transform.position, transform.position + Vector3.left * actualStopDistance, Color.red);
}
}

private IEnumerator Attack()
{
if (!canAttack) yield break;

canAttack = false;

if (debugMode)
{
Debug.Log($"[{gameObject.name}] Starting attack");
}

// Play attack animation
if (animator != null)
{
animator.SetTrigger("Attack");
}

// Deal damage
if (playerHealth != null)
{
if (debugMode)
{
Debug.Log($"[{gameObject.name}] Dealing {normalAttackDamage} damage");
}
playerHealth.TakeDamage(normalAttackDamage);
}

// Wait for cooldown
yield return new WaitForSeconds(attackCooldown);

canAttack = true;
}

public void SetPlayer(Transform playerTransform)
{
player = playerTransform;
if (player != null)
{
playerHealth = player.GetComponent();
}
}

private void OnDisable()
{
// Make sure we can attack when re-enabled
canAttack = true;
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... eal-damage
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»