Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2025, 19:31   #1
Tanr1
Новичок
Джуниор
 
Регистрация: 29.03.2025
Сообщений: 1
По умолчанию Помоги решить задачу

У меня есть задача: создать моба сова, которая при запуске будет двигаться (лететь) в сторону объекта Player и убавлять от него по 5 хп за каждую атаку. После каждой атаки она будет отлетать по диагонали от объекта Player. Например на: y - 2, x - 2 (это максимально будет то, на сколько сова сможет отлетать.), чтобы данный моб был виден на экране у пользователя. После отлета разумеется она будет заново к нему приближаться убавлять по 5 хп и.т.д до бесконечности, пока игрок просто не убежит от нее.

PlayerHealth.cs (хп игрока):
Код:
using UnityEngine;

public class PlayerHealth : MonoBehaviour
{
    public int maxHealth = 100; // Максимальное хп
    public int currentHealth; // Текущее хп

    void Start()
    {
        currentHealth = maxHealth;        
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;
        Debug.Log("Player took damage: " + damage + ". Current health: " + currentHealth);

        if (currentHealth <= 0)
        {
            Die();
        }
    }

    public bool IsAlive()
    {
        return currentHealth > 0;
    }

    private void Die()
    {
        Debug.Log("Player has died.");
        gameObject.SetActive(false);
    }
}



OwlMob.cs (скрипт на самого моба: сова):
Код:
using UnityEngine;

public class OwlMob : MonoBehaviour 
{
    public float speed = 2f; // Скорость движения совы
    public float attackRange = 1.5f; // Радиус, в котором сова может атаковать игрока 
    public int damage = 5; // Урон, который наносит сова

    private Transform player;
    private PlayerHealth playerHealth;
    private Rigidbody rb;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        if (player != null)
        {
            playerHealth = player.GetComponent<PlayerHealth>();
        }
        else
        {
            Debug.LogError("Player not found! Make sure the player has the tag 'Player'.");
        }

        rb = GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.isKinematic = true;
        }
    }

    void Update()
    {
        if (player != null)
        {
            MoveTowardsPlayer();
        }
    }

    private void MoveTowardsPlayer()
    {
        Vector3 direction = (player.position - transform.position).normalized;
        Vector3 newPosition = transform.position + direction * speed * Time.deltaTime;

        transform.position = newPosition;

        float distanceToPlayer = Vector3.Distance(transform.position, player.position);
        if (distanceToPlayer < attackRange)
        {
            AttackPlayer();
        }
    }

    private void AttackPlayer()
    {
        if (playerHealth != null)
        {
            playerHealth.TakeDamage(damage);
            Debug.Log("Owl attacked the player!");
        }
    }
}
Помогите пожалуйста кто знает
Tanr1 вне форума Ответить с цитированием
Старый 31.03.2025, 19:37   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

А текущий скрипт-то работает технически ? поглядел код, вроде всё адекватно, но, конечно, понятно, что при достижении игрока сова при текщем скрипте будет телепаться возле игрока и убивать его в ноль довольно быстро.
Если технически работает, то дополнить не так уж и сложно будет.
можно сделать красиво, конечно, но для демонстрации сойдёт и простая лапша (к тому же пиишу без оглядки на юнити, могу быть не совсем точен):
добавьте поле для таргет позиции, которое можно инициализировать в нулл
вместо игрока в расчет надо подставить будет эту позицию, примерно так:
Код:
private Vector3? target = null;
...
var currentTargetPosition = target ?? player.position;
var range = target is null ? attackRange : 0.1;
Vector3 direction = (currentTargetPosition  - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;

var distanceToTarget = Vector3.Distance(transform.position, currentTargetPosition);
if (distanceToTarget < range)
{
    if (target is null)
    {
         AttackPlayer(); // hit player 
         target = transform.position - new Vector3(2, 2, 0); // and set target to fly away
    }
    else
        target = null; // we reached target, resetting back to hunt player
}
кстати, советую взять любую нейросетку, они с такими простыми вещами довольно хорошо помогают

Последний раз редактировалось phomm; 31.03.2025 в 19:41.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ребята помоги решить две задачи!Туплю! Мортум Паскаль, Turbo Pascal, PascalABC.NET 5 08.06.2015 22:33
Помоги решить ошибку программы по сортировке массивов. fallen1124 Паскаль, Turbo Pascal, PascalABC.NET 8 19.01.2014 15:17
Здравствуйте,помоги решить задачи на массив. Зухра89 Помощь студентам 0 10.02.2012 23:11
Люди помоги решить задачку плиззззз!!!! mad777 Фриланс 3 03.06.2008 12:34