Создание вражеского класса - PullRequest
0 голосов
/ 28 августа 2018

Я никогда не делал этого раньше, и мое истинное понимание занятий не так уж и хорошо. Тем не менее, я планирую освоить его после этого проекта! Я хотел бы создать класс для определения типа врага с помощью TAG: Enemy1 или Boss. (Я уже разработал систему для рандомизации статистики Enemy1, поэтому никакие два не будут одинаковыми. Однако здесь я просто хочу узнать, как правильно настроить статистику врагов, так что вот мой код)

using System.Collections;

public class Enemies : MonoBehaviour {

    public float MaxHp;
    public static float Hp;
    GameObject enemy = GameObject.Find("Enemy1");
    GameObject boss = GameObject.Find("Boss");

    void Awake()
    {
        AssignStats(enemy, MaxHp);
    }

    public static void AssignStats (GameObject en, float MaxHp)
    {

        if (en.tag == "Enemy1")
        {
            MaxHp = 50;
            Hp = MaxHp;
            Debug.Log(Hp);
        }

        if (en.tag == "Boss")
        {

            MaxHp = 500;
            Hp = MaxHp;
            Debug.Log(Hp);
        }
    }
}

Этот код не работает. Почему?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Я бы сделал это так:

//enum contains all your enemies
public enum EnemyType
{
    Enemy1,
    Boss
}

public class Enemies : MonoBehaviour
{
    //This will be assigned in the inspector
    public EnemyType CurrentEnemyType;

    //You don't need them to be public since you are hardcoding them.
    private float MaxHp;
    private float Hp;

    void Awake()
    {
        AssignStats();
    }

    public void AssignStats()
    {
        if (gameObject.CompareTag(CurrentEnemyType.ToString()))
        {
            if (CurrentEnemyType == EnemyType.Enemy1)
            {
                MaxHp = 50;
                Hp = MaxHp;
                Debug.Log(Hp);
            }
            // instead of doing separated if blocks, you need to do if else for less code execution
            else if (CurrentEnemyType == EnemyType.Boss) 
            {
                MaxHp = 500;
                Hp = MaxHp;
                Debug.Log(Hp);
            }
        /*
         More simplified way instead of the if else, if you assume that all your enemies except the boss have 50 hp.

        MaxHp = CurrentEnemyType == EnemyType.Boss ? 500 : 50;
        Hp = MaxHp;
        Debug.Log(Hp);
        */

        }
    }
}

Ура! * * 1004

0 голосов
/ 28 августа 2018

enter image description here

Класс противника: Enemy.cs (не монобихевиор)

using UnityEngine;

[System.Serializable]
public class Enemy
{
     public EnemyType EnemyType;
     public GameObject EnemyPrefab;
     public string EnemyTag;
     public int MaxHealth;
     public int EnemyDamage;
     public Vector3 SpawnPos;

     private int _currentHealth;

public void Init()
{
    _currentHealth = MaxHealth;
}


public void UpdateHealth(int newHealthValue)
{
    _currentHealth = newHealthValue;
}

public void ReceiveDamage(int damage)
{
    var updatedHealth = _currentHealth - damage;
    UpdateHealth(updatedHealth > 0 ? updatedHealth : 0);
}

}

Enemies Class: Enemies.cs, которые управляют всеми врагами, рандомизируются между врагами

using UnityEngine;

public enum EnemyType
{
    Enemy1,
    Enemy2,
    Enemy3,
    Enemy4,
    Enemy5,
    Boss
}

public class Enemies : MonoBehaviour
{
    public Enemy[] AllEnemies;
    //Initial Value
    public int NumberOfEnemies = 3;

private void Start()
{
    InitEnemies(NumberOfEnemies);
}

public void InitEnemies(int howManyEnemies)
{
    for(int i= 0; i < howManyEnemies; i++)
    {
        var randomIndex = Random.Range(0, AllEnemies.Length - 1);

        SpawnEnemy(AllEnemies[randomIndex]);
    }
}

    public void SpawnEnemy(Enemy enemy)
    {
        Instantiate(enemy.EnemyPrefab, enemy.SpawnPos, Quaternion.identity);
        enemy.Init();
    }
}

Вы можете видеть, что я назначил все данные врагов в инспекторе, которые появляются из массива врагов в классе врагов, у него есть вражеский префаб, позиция, урон и т. Д.

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать:)

Ура!

0 голосов
/ 28 августа 2018

если я правильно понял.

вам не нужно передавать параметры в метод AssignStats, потому что все необходимое вам свойство в классе.

Я бы использовал gameObject.tag, чтобы получить текущий тег объекта добавления.

  • если вы добавите компонент Enemy1, вы выполните условие gameObject.tag == "Enemy1".

  • если вы добавите компонент Boss, вы выполните условие gameObject.tag == "Boss".

вы просто добавляете скрипт в свой компонент роли и помечаете правый тег.

using System.Collections;

public class Enemies : MonoBehaviour {

    public float MaxHp;
    public float Hp;

    void Awake()
    {
        AssignStats();
    }

    public void AssignStats ()
    {

        if (gameObject.tag == "Enemy1")
        {
            MaxHp = 50;
            Hp = MaxHp;
            Debug.Log(Hp);
        }

        if (gameObject.tag== "Boss")
        {

            MaxHp = 500;
            Hp = MaxHp;
            Debug.Log(Hp);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...