Как я могу использовать общую открытую переменную из некоторых неизвестных классов? - PullRequest
0 голосов
/ 05 апреля 2019

Я не опубликовал это на форуме Unity, потому что я думаю, что это больше связано с c #, чем с Unity Я хочу застрелить врага. Мой враг или игрок, или вражеский ИИ. У игрока есть PlayerCombatSystem, а у противника - EnemyCombatController. Я использую переменную Object, чтобы взять один из этих двух сценариев, используя

GetComponent<ScriptName>()

коллайдер означает объект, с которым я сталкиваюсь

Что я могу сделать, чтобы добавить значение, которое я храню в PlayerCombatSystem или EnemyCombatController для повреждения? Ущерб является общественной ценностью

Это были мои две попытки исправить тикс

float gotDamage = shotterDamage * (100 / (100 + enemy.GetInstanceID.

float gotDamage = shotterDamage * (100 / (100 + enemy.damage;


Object enemy;
float shotterDamage;

if(shotter.GetComponent<PlayerCombatSystem>() != null)
{
    shotterDamage = shotter.GetComponent<PlayerCombatSystem>().damage;
}
else if(shotter.GetComponent<EnemyCombatController>() != null)
{
    shotterDamage = shotter.GetComponent<EnemyCombatController>().damage;
}
else
{
    Debug.Log("ERROR 0");
}

if (collision.GetComponent<PlayerCombatSystem>() != null)
{
    enemy = collision.GetComponent<PlayerCombatSystem>();
}
else if (collision.GetComponent<EnemyCombatController>() != null)
{
    enemy = collision.GetComponent<EnemyCombatController>();
}

float gotDamage = shotterDamage * (100 / (100 + enemy

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

создать общий базовый класс, например,

// abstract just makes sure this can't be instanced 
// directly but only inherited types
public abstract class CombatBase : MonoBehaviour
{
   public float Damage; 
}

и чем заставить ваши два скрипта наследовать от этого базового класса

public class PlayerCombatSystem : CombatBase 
{
    // inherits Damage and everything implemented in CombatBase
    // so remove it here

    // and here you can extend it with its speicifc behaviour
}

и

public class EnemyCombatController : CombatBase 
{
    // inherits Damage and everything implemented in CombatBase
    // so remove it here

    // and here you can extend it with its speicifc behaviour
}

чем в вашем скрипте вы можете просто использовать

CombatBase enemy;

...

// this will also find either PlayerCombatSystem 
// or EnemyCombatController since they are both of type 
// CombatBase
enemy = collision.GetComponent<CombatBase>();

...

float gotDamage = shotterDamage * (100 / (100 + enemy.Damage);
0 голосов
/ 06 апреля 2019

Другой вариант - использовать конструктор, например:

public class EnemyCombatController : MonoBehaviour
{

public PlayerCombatSystem constructorPlayerCombatSystem ;

//your code

//...

//Damage has changed in the other script (PlayerCombatSystem)



float gotDamage = shotterDamage * (100 / (100 + enemy.constructorPlayerCombatSystem.Damage);

}

Создание конструктора другого класса используется, когда вы хотите использовать переменную в обоих классах

Я не очень хорошо понял работу вашего кода, но, немного упрощая, я делаю вывод, что игра выполняется в другом или других сценариях, и при обнаружении удара (или попадании) переменная Damage изменяется.

Предполагая, что эта переменная находится в сценарии, который есть у игрока, вы хотите использовать ее в сценарии, в котором есть враг (или наоборот) (или что переменная находится в другом сценарии, и вы хотите использовать ее в два других), вы можете создать переменную типа другого класса и использовать ее в этом классе.

помните, что вы должны ссылаться на объект, который содержит класс в инспекторе

Надеюсь, это поможет вам, или скажите, понял ли я что-то не так в вашей проблеме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...