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

时间:2015-07-02 20:41:19

标签: c# unity3d unityscript

我一直在尝试将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为void和void从我的编码背景中浮出错误,我只是不知道如何在C#中修复这两个。

1 个答案:

答案 0 :(得分: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#编程时 修改
至于您在其他答案的注释中描述的空引用异常,这是因为GameObject主干未定义或声明为public或private。将GameObject公开并在检查器中定义它。