无法从源类型强制转换为目标类型迭代转换

本文关键字:类型 转换 目标 迭代 | 更新日期: 2023-09-27 17:58:35

我正在用C#编写一个昼夜循环脚本。我不知道它是否有什么好处,我只是在C#中尝试一些东西,因为我是新手。我想我这里有一个相当不错的代码,调试在我测试游戏之前不会说任何话。当我测试它时,它会说:

InvalidCastException:无法从源类型强制转换为目标类型cycleFlow.DayNightCycle()(位于Assets/Scripts/cycleFlow.cs:28)cycleFlow.Update()(位于Assets/Scripts/cycleFlow.cs:14)

这就是我得到的:

using UnityEngine;
using System.Collections;
public class cycleFlow : MonoBehaviour {
  private Color night;
  private Color day;
  void Start () {
    night [0] = 30;
    night [1] = 30;
    night [2] = 30;
    day [0] = 255;
    day [1] = 255;
    day [2] = 255;
  }
  void Update () {
    DayNightCycle ();
  }
  void DayNightCycle()
  {
    foreach (SpriteRenderer child in transform)
      if(Input.GetKeyDown(KeyCode.Q))
        child.color = Color.Lerp(child.color, night, Time.deltaTime);
    foreach (SpriteRenderer child in transform)
      if(Input.GetKeyDown(KeyCode.E))
        child.color = Color.Lerp(child.color, day, Time.deltaTime);
  }
}

怎么回事?(第一次在这里发帖顺便说一句,如果我做错了什么,很抱歉)

无法从源类型强制转换为目标类型迭代转换

尝试此修改只是为了克服错误:

foreach (SpriteRenderer child in transform.GetComponentsInChildren<SpriteRenderer>())

更进一步,我会尽量记住帧速率。如果可以的话,可以通过Start函数缓存这些渲染器。此外,我会将if(Input.GetKeyDown(KeyCode.E))移动到您的循环之外,而不是内部。

编辑:回到这里,我还注意到你只是在按下键时才采取行动,而不是在按下键的任何时候。(参见GetKeyDownGetKeyGetKeyUp之间的差异)。你可以试试这样的东西:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class cycleFlow : MonoBehaviour
{
  private Color night;
  private Color day;
  private IEnumerable<SpriteRenderer> childSpriteRenderers;
  void Start ()
  {
    night = new Color(30, 30, 30);
    day = Color.white;
    childSpriteRenderers = transform.GetComponentsInChildren<SpriteRenderer> ();
  }
  void Update ()
  {
    DayNightCycle ();
  }
  void DayNightCycle ()
  {
    if (Input.GetKey (KeyCode.Q))
    {
      foreach (SpriteRenderer child in childSpriteRenderers)
      {
        child.color = Color.Lerp (child.color, night, Time.deltaTime);
      }
    }
    if (Input.GetKey (KeyCode.E))
    {   
      foreach (SpriteRenderer child in childSpriteRenderers)
      {
        child.color = Color.Lerp (child.color, day, Time.deltaTime);
      }
    }
  }
}