我一直在尝试将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#中修复这两个。
答案 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公开并在检查器中定义它。