无法从另一个脚本分配结构等于结构

时间:2019-01-31 20:55:03

标签: c# unity3d

我正在研究玩家的动作编码,我想为“加电”等做好预制的动作统计信息。为了便于组织,我将统计信息管理脚本与运动脚本分开制作,并且将运动变量打包在结构中,以便可以在“播放模式”期间将其切换出来。

我可以从stats管理脚本中导入Outgoing 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...");
}

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

1 个答案:

答案 0 :(得分:2)

这些脚本都使用org.springframework.web.client.RestClientException: Error while extracting response for type [class com.**.ResponseDTO] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.lang.String out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 604] (through reference chain: com.****.ResponseDTO["explanation"]) ,所以我猜想Start()首先发生,并且在抓取结构时,它抓取MovementScript.Start(),因为您的统计管理脚本尚未初始化还没完成。您可以将default(StatsSet)放入其中,以确认这是您的问题,但以下是解决方法:

一种选择是在统计管理脚本中将Debug.Log()重命名为Start()。您可以在this video中了解有关Awake vs Start的更多信息,但是在TL; DR中,所有活动脚本都运行它们的Awake(),然后所有脚本都运行它们的Awake()

您的另一个选择是更改“脚本执行顺序”。如果您不触摸Script Execution Order Settings,则不同的Start()功能的顺序将是未知的。您可以使用该设置菜单,通过给它一个明确的执行顺序来确保统计管理脚本始终在您的运动脚本之前执行。