【问题标题】:Cannot implicitly convert type 'float' to 'void'无法将类型“float”隐式转换为“void”
【发布时间】:2015-07-02 20:41:19
【问题描述】:

我一直在尝试将 UnityScript 转换为 C#,但出现错误。以下是我的源代码:

 GameObject spine;
 private float z = 0;
 private float ySpeed = 13.0f;
 private float zMinLimit = -40.00f;
 private float zMaxLimit = 40.00f;

 void LateUpdate() {
     z -= Input.GetAxis("Mouse Y") * ySpeed;
     z = ClampAngle(z, zMinLimit, zMaxLimit);
     Quaternion rotation_bone = Quaternion.Euler(0, 0, -z);
     spine.transform.localRotation = rotation_bone;
 }

 static void ClampAngle (float angle, float min, float max) {
     if (angle < -360){
         angle += 360;
     }
     if (angle > 360){
         angle -= 360;
     }
     return Mathf.Clamp (angle, min, max);
 } 

导致编译错误的行是:

z = ClampAngle(z, zMinLimit, zMaxLimit);

出现错误:

无法将类型“void”隐式转换为“float”

第二行引发两个额外的编译器错误。

return Mathf.Clamp (angle, min, max);

'rotateBones.ClampAngle(float, float, float):方法返回void时,return关键字后面不能跟表达式

无法将类型“float”隐式转换为“void”

我从我的编码背景中了解 float to void 和 void to float 错误,我只是不知道如何在 C# 中修复这两个错误。

【问题讨论】:

  • ClampAngle 定义的返回类型表明它正在返回 void。你实际上是在返回float。修复返回类型,它应该可以工作。
  • 这是我的担心。我知道错误是什么,我只是不知道如何转换该值。我尝试铸造(浮动)ClampAngle(z,zMinLimit,zMaxLimit);它没有用。

标签: c# unity3d unityscript


【解决方案1】:

在使用 C# 时,void 用于定义不返回值的方法,因此为了符合 C# 语法,void 的方法类型不能包含该返回行。但是,通过将 void 更改为变量类型或类,例如 int、bool、float、string 等...,您可以让它返回该类型。因此,在您的情况下,您将返回三个浮点数的 Mathf.Clamp,这将返回一个浮点数。所以你的新代码看起来像这样:

public GameObject spine;
private float z = 0;
private float ySpeed = 13.0f;
private float zMinLimit = -40.00f;
private float zMaxLimit = 40.00f;

void LateUpdate() {
    z -= Input.GetAxis("Mouse Y") * ySpeed;
    z = ClampAngle(z, zMinLimit, zMaxLimit);
    Quaternion rotation_bone = Quaternion.Euler(0, 0, -z);
    spine.transform.localRotation = rotation_bone;
}

static float ClampAngle (float angle, float min, float max) {
    if (angle < -360){
        angle += 360;
    }
    if (angle > 360){
        angle -= 360;
    }
    return Mathf.Clamp (angle, min, max);
} 

一个简单的修复,但在使用 C# 编程时必须知道。
编辑:
至于您在另一个答案的 cmets 中描述的空引用异常,这是因为 GameObject 脊椎未定义或声明为公共或私有。将 GameObject 公开并在检查器中定义。

【讨论】:

  • 谢谢,我知道这个错误,因为我确实有编程背景。解决办法是公开脊椎。代码现在可以正常工作。我已将此标记为已解决。 :)
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2014-04-14
  • 2016-02-17
  • 2015-04-26
  • 2015-03-16
相关资源
最近更新 更多