簡體   English   中英

Unity c# 需要幫助理解 switch 語句

[英]Unity c# need help understanding switch statement

我試圖用它們來理解 switch 語句和條件。

這是當前的腳本。

Unit thisUnit; <- my reference to the unit stats it has.
int captureStartingHealth;
int captureStartingMana
 
void Start()
{
    captureStartingHealth = thisUnit.currentHP;
    // In start it's the same as thisUnit.maxHP;
    captureStartingMana = thisUnit.currentMP;
    // In start it's the same as thisUnit.maxMP;
}
 
void AssignmentSwitchStatement()
{
    switch (captureStartingHealth)
   {
case int captureStartingHP when captureStartingHealth < (float)captureStartingHealth:
        behaviour = Behaviour.SUPPORT;
        roll = Random.Range(0, 101);
        IncrementSupportRollChances();
        break;
default:
        roll = Random.Range(0, 101);
        DefaultRollChances();
        break;
   }
}

例如,當我的 captureStartingHealth 變量小於 40 時,構建引用方式的正確語法是什么。 當我創建語法時,它不允許我簡單地使用整數“captureStartingHealth”代替..它似乎只有在我為案例創建一個新的整數變量時才有效。

那么,為什么我不能像這樣使用我的 captureStartingHealth 整數?

switch (captureStartingHealth) // example switch
        {
            case captureStartingHealth when captureStartingHealth < (float)thisUnit.maxHP:
             //execute code
             break;
        }
"

相反,它需要我創建一個新整數

case int a when a < conditional

但是我怎么知道這個新的 int 什么時候達到了條件為真呢? 就像我不明白這個 int "a" 是如何用於 switch 的,因為它是一個沒有分配任何東西的本地整數嗎? 所以對我來說就像說..

case int a (0) 當 a (0) < (float)thisUnit.maxHP: // 執行代碼

我在這里做錯了什么? 可能有很多事情,但老實說我不知道​​為什么這個案例需要一個新的整數,而不是使用我想為條件語句比較的值。

第一個switch代碼完全沒有意義!

switch(captureStartingHealth)
{
    case int captureStartingHP:
        ...
        break;

    default:
        ...
        break;
}

您通過模式匹配進行類型檢查並檢查captureStartingHealth是否為int 基本上喜歡做

if(captureStartingHealth is int captureStartingHP)
{
    ...
}
else
{
    ...
}

哪種等於做

if(captureStartingHealth.GetType().IsAssignableTo(typeof(int)))
{
    int captureStartingHP = (int)captureStartingHealth;

    ...
}
else
{
    ...
}

但是由於captureStartingHealth一個int無論如何這總是true並且只是不必要的開銷。

然后你無論如何扔掉類型轉換captureStartingHP並比較

captureStartingHealth < (float)captureStartingHealth

這里有兩件奇怪的事情:

  • 比較兩個int值時,什么是float好?
  • a < a永遠不會是真的......你有兩次相同的變量!

如前所述,如果您真正想要做的唯一檢查是比較兩個值,您寧願使用簡單的if - else

// you do this in any case so rather pull it out of the checks in order to write/maintain it only once
roll = Random.Range(0, 101);

if(captureStartingHealth < thisUnit.maxHP)
{
    behaviour = Behaviour.SUPPORT;
    IncrementSupportRollChances();
}
else
{
    DefaultRollChances();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM