C# Can';t指定Struct等于另一个脚本中的Struct

C# Can';t指定Struct等于另一个脚本中的Struct,c#,unity3d,C#,Unity3d,我正在进行玩家动作编码,我想为“加电”等准备好预先制作的动作统计数据。为了便于组织,我将统计管理脚本与我的移动脚本分开,并且我将移动变量打包在结构中,以便在播放模式下可以将它们切换出去 我可以从Stats管理脚本中导入传出的Stats结构,但我希望将该结构分配给移动脚本中它自己的变量,以便更容易处理。它确实复制,但我的新结构变量在其所有内部变量上返回0,而不是从原始结构复制值 Tl;dr Im试图将一个结构从一个脚本复制到另一个脚本,但当所述结构复制时,该副本的变量为0 统计信息管理脚本 pub

我正在进行玩家动作编码,我想为“加电”等准备好预先制作的动作统计数据。为了便于组织,我将统计管理脚本与我的移动脚本分开,并且我将移动变量打包在结构中,以便在播放模式下可以将它们切换出去

我可以从Stats管理脚本中导入传出的Stats结构,但我希望将该结构分配给移动脚本中它自己的变量,以便更容易处理。它确实复制,但我的新结构变量在其所有内部变量上返回0,而不是从原始结构复制值

Tl;dr Im试图将一个结构从一个脚本复制到另一个脚本,但当所述结构复制时,该副本的变量为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...");
}
动作脚本

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...");
}
私人刚体播放器rigid;
私人int跳线检查;
private bool IsGrounded=true;
公共对撞机地面对撞机;
私有int-HiddenJumpCount;
//导入玩家统计数据
私人玩家状态PStats;
私人PlayerStats.statset PlayerStats;
//用于初始化
void Start()
{
PStats=GetComponent();
PlayerRigid=GetComponent();
PlayerStats=PStats.StatsOut;
JumpCheck=PlayerStats.JumpCount;
Log(“启动并运行…”);
}

PStats.Out返回我期望的值,但PlayerStats返回的值似乎是空值

这些脚本都在使用
Start()
,所以我猜是
MovementScript.Start()
首先发生,当它抓取结构时,它抓取的是
默认值(statset)
因为您的统计管理脚本尚未初始化它。您可以在每个日志中抛出一个
Debug.Log()
,以确认这是您的问题,但下面介绍了如何修复它:

一个选项是在Stats管理脚本中将
Start()
重命名为
Awake()
。你可以在TL中了解更多关于清醒vs开始的信息;DR,所有活动脚本运行它们的
Awake()
,然后所有脚本运行它们的
Start()


您的另一个选项是更改“脚本执行顺序”。如果不触摸,则不同的
Start()
函数的顺序将未知。您可以使用该“设置”菜单,通过给脚本一个明确的执行顺序来确保Stats Management脚本始终在移动脚本之前执行。

编辑脚本执行顺序似乎解决了这个问题。谢谢大家!@ValueChip不要忘记通过单击旁边的复选标记符号来接受答案-这会将问题标记为已解决,以供其他任何遇到此问题的人使用。