Невозможно назначить структуру равную структуре из другого скрипта - PullRequest
0 голосов
/ 31 января 2019

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

Я могу импортировать структуру Исходящие статистические данные изсценарий управления статистикой, но я хочу присвоить структуру его собственной переменной в сценарии перемещения, чтобы ее было проще обрабатывать.Он копирует, но моя новая переменная структуры возвращает 0 для всех своих внутренних переменных вместо копирования значений из исходной структуры.

Tl; dr Я пытаюсь скопировать структуру из одного сценария в другой, но когда сказаноСтруктура копирует, копия имеет переменные с 0.

Сценарий управления статистикой

public struct StatsSet
{
    public int JumpCount;
    public float JumpPower;
    public float MoveSpeed;
    public float QuickFallMultiplier;
    public float BaseFallMultiplier;
}

//Public variables for experimental movement stats testing
public int ExJumpCount = 1;
public float ExJumpPower = 6.0f;
public float ExMoveSpeed = 4.0f;
public float ExQuickFallMultiplier = 2.0f;
public float ExBaseFallMultiplier = 2.5f;

public int Statpick = 1;
public StatsSet StatsOut;
private StatsSet ExStats;
private StatsSet BaseStats;

// Use this for initialization
void Start () {
    BaseStats.JumpCount = 1;
    BaseStats.JumpPower = 6.0f;
    BaseStats.MoveSpeed = 4.0f;
    BaseStats.QuickFallMultiplier = 2.0f;
    BaseStats.BaseFallMultiplier = 2.5f;

    ExStats.BaseFallMultiplier = ExBaseFallMultiplier;
    ExStats.JumpCount = ExJumpCount;
    ExStats.JumpPower = ExJumpPower;
    ExStats.MoveSpeed = ExMoveSpeed;
    ExStats.QuickFallMultiplier = ExQuickFallMultiplier;
    Statpick = 1;
}

// Update is called once per frame
void Update () {
    if (Statpick == 0)
    {
        StatsOut = ExStats;
    }
    else if (Statpick == 1)
    {
        StatsOut = BaseStats;
    }
}

Сценарий движения

private Rigidbody PlayerRigid;
private int JumpCheck;
private bool IsGrounded = true;
public Collider GroundCollider;
private int HiddenJumpCount;

//Import of player stats data
private PlayerStats PStats;
private PlayerStats.StatsSet PlayerStats;

// Use this for initialization
void Start()
{
    PStats = GetComponent<PlayerStats>();
    PlayerRigid = GetComponent<Rigidbody>();
    PlayerStats = PStats.StatsOut;
    JumpCheck = PlayerStats.JumpCount;
    Debug.Log("Up and running...");
}

PStats.Out возвращает ожидаемые значения, но PlayerStatsвозвращает значения, которые кажутся пустыми

1 Ответ

0 голосов
/ 01 февраля 2019

Оба сценария используют Start(), поэтому я предполагаю, что сначала происходит MovementScript.Start(), а когда он захватывает структуру, он получает default(StatsSet), потому что ваш скрипт управления статистикой еще не инициализировал его.Вы можете добавить Debug.Log() в каждый, чтобы подтвердить, что это ваша проблема, но вот как это исправить:

Один из вариантов - переименовать Start() в Awake() в вашем скрипте управления статистикой.Вы можете узнать больше об Awake vs Start в этом видео , но TL; DR, все активные сценарии запускают свои Awake() , затем все сценарии запускают свои Start().

Другой вариант - изменить «Порядок выполнения скрипта».Если вы не коснетесь Настройки порядка выполнения скриптов , порядок различных функций Start() будет неизвестен.Вы можете использовать это меню настроек, чтобы вместо этого гарантировать, что ваш скрипт управления статистикой всегда выполняется перед вашим скриптом перемещения, задав ему явный порядок выполнения.

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