我正在尝试将 java 脚本统一转换为 csharp 脚本,但出现了一些错误?
I'm trying to convert java script in unity to csharp script but getting some errors?
转换后csharp中的脚本:
using UnityEngine;
using System.Collections;
public class MYCLASSNAME : MonoBehaviour {
public Transform TargetLookAt;
public float Distance = 5.0f;
public float DistanceMin = 3.0f;
public float DistanceMax = 10.0f;
private float mouseX = 0.0f;
private float mouseY = 0.0f;
private float startingDistance = 0.0f;
private float desiredDistance = 0.0f;
public float X_MouseSensitivity = 5.0f;
public float Y_MouseSensitivity = 5.0f;
public float MouseWheelSensitivity = 5.0f;
public float Y_MinLimit = -40.0f;
public float Y_MaxLimit = 80.0f;
public float DistanceSmooth = 0.05f;
private float velocityDistance = 0.0f;
private Vector3 desiredPosition = Vector3.zero;
public float X_Smooth = 0.05f;
public float Y_Smooth = 0.1f;
private float velX = 0.0f;
private float velY = 0.0f;
private float velZ = 0.0f;
private Vector3 position = Vector3.zero;
CursorLockMode wantedMode;
void Start (){
Distance = Mathf.Clamp(Distance, DistanceMin, DistanceMax);
startingDistance = Distance;
Reset();
SetCursorState();
OnGUI();
}
void LateUpdate (){
if (TargetLookAt == null)
return;
HandlePlayerInput();
CalculateDesiredPosition();
UpdatePosition();
}
void HandlePlayerInput (){
float deadZone= 0.01f; // mousewheel deadZone
//if (Input.GetMouseButton(1))
//{
mouseX += Input.GetAxis("Mouse X") * X_MouseSensitivity;
mouseY -= Input.GetAxis("Mouse Y") * Y_MouseSensitivity;
//}
// this is where the mouseY is limited - Helper script
mouseY = ClampAngle(mouseY, Y_MinLimit, Y_MaxLimit);
// get Mouse Wheel Input
if (Input.GetAxis("Mouse ScrollWheel") < -deadZone || Input.GetAxis("Mouse ScrollWheel") > deadZone)
{
desiredDistance = Mathf.Clamp(Distance - (Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity),
DistanceMin, DistanceMax);
}
}
void CalculateDesiredPosition (){
// Evaluate distance
Distance = Mathf.SmoothDamp(Distance, desiredDistance, velocityDistance, DistanceSmooth);
// Calculate desired position -> Note : mouse inputs reversed to align to WorldSpace Axis
desiredPosition = CalculatePosition(mouseY, mouseX, Distance);
}
float CalculatePosition ( float rotationX , float rotationY , float distance ){
Vector3 direction = new Vector3(0, 0, -distance);
Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0);
return TargetLookAt.position + (rotation * direction);
}
void UpdatePosition (){
float posX= Mathf.SmoothDamp(position.x, desiredPosition.x, velX, X_Smooth);
float posY= Mathf.SmoothDamp(position.y, desiredPosition.y, velY, Y_Smooth);
float posZ= Mathf.SmoothDamp(position.z, desiredPosition.z, velZ, X_Smooth);
position = new Vector3(posX, posY, posZ);
transform.position = position;
transform.LookAt(TargetLookAt);
}
void Reset (){
mouseX = 0;
mouseY = 10;
Distance = startingDistance;
desiredDistance = Distance;
}
float ClampAngle ( float angle , float min , float max ){
while (angle < -360 || angle > 360)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
}
return Mathf.Clamp(angle, min, max);
}
// Apply requested cursor state
void SetCursorState ()
{
Cursor.lockState = wantedMode;
// Hide cursor when locking
Cursor.visible = (CursorLockMode.Locked != wantedMode);
}
void OnGUI ()
{
GUILayout.BeginVertical ();
// Release cursor on escape keypress
if (Input.GetKeyDown (KeyCode.Escape))
Cursor.lockState = wantedMode = CursorLockMode.None;
switch (Cursor.lockState)
{
case CursorLockMode.None:
GUILayout.Label ("Cursor is normal");
if (GUILayout.Button ("Lock cursor"))
wantedMode = CursorLockMode.Locked;
if (GUILayout.Button ("Confine cursor"))
wantedMode = CursorLockMode.Confined;
break;
case CursorLockMode.Confined:
GUILayout.Label ("Cursor is confined");
if (GUILayout.Button ("Lock cursor"))
wantedMode = CursorLockMode.Locked;
if (GUILayout.Button ("Release cursor"))
wantedMode = CursorLockMode.None;
break;
case CursorLockMode.Locked:
GUILayout.Label ("Cursor is locked");
if (GUILayout.Button ("Unlock cursor"))
wantedMode = CursorLockMode.None;
if (GUILayout.Button ("Confine cursor"))
wantedMode = CursorLockMode.Confined;
break;
}
GUILayout.EndVertical ();
SetCursorState ();
}
}
线路上的错误:
Distance = Mathf.SmoothDamp(Distance, desiredDistance, velocityDistance, DistanceSmooth);
Error CS1502: The best overloaded method match for
'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has
some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword
(CS1620) (Assembly-CSharp)
在线:
desiredPosition = CalculatePosition(mouseY, mouseX, Distance);
Error CS0029: Cannot implicitly convert type 'float' to
'UnityEngine.Vector3' (CS0029) (Assembly-CSharp)
在线:
return TargetLookAt.position + (rotation * direction);
Error CS0029: Cannot implicitly convert type 'UnityEngine.Vector3' to
'float' (CS0029) (Assembly-CSharp)
在线:
float posX= Mathf.SmoothDamp(position.x, desiredPosition.x, velX, X_Smooth);
Error CS1502: The best overloaded method match for
'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has
some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword
(CS1620) (Assembly-CSharp)
在线:
float posY= Mathf.SmoothDamp(position.y, desiredPosition.y, velY, Y_Smooth);
Error CS1502: The best overloaded method match for
'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has
some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword
(CS1620) (Assembly-CSharp)
在线:
float posZ= Mathf.SmoothDamp(position.z, desiredPosition.z, velZ, X_Smooth);
Error CS1502: The best overloaded method match for
'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has
some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword
(CS1620) (Assembly-CSharp)
错误字面意思是:“必须使用 ref 关键字传递参数”。这意味着您必须将 ref 添加到参数中,以将参数标记为 in/out.
例如:
Distance = Mathf.SmoothDamp(Distance, desiredDistance, ref velocityDistance, DistanceSmooth);
对于您的函数 CalculatePosition
,您只是定义了错误的 return 类型。里面的代码不是 return 一个浮点数,它 return 是一个 Vector3,对于一个位置来说很自然。
/* Does not return a float! */
Vector3 CalculatePosition(float rotationX, float rotationY, float distance)
{
Vector3 direction = new Vector3(0, 0, -distance);
Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0);
return TargetLookAt.position + (rotation * direction);
}
转换后csharp中的脚本:
using UnityEngine;
using System.Collections;
public class MYCLASSNAME : MonoBehaviour {
public Transform TargetLookAt;
public float Distance = 5.0f;
public float DistanceMin = 3.0f;
public float DistanceMax = 10.0f;
private float mouseX = 0.0f;
private float mouseY = 0.0f;
private float startingDistance = 0.0f;
private float desiredDistance = 0.0f;
public float X_MouseSensitivity = 5.0f;
public float Y_MouseSensitivity = 5.0f;
public float MouseWheelSensitivity = 5.0f;
public float Y_MinLimit = -40.0f;
public float Y_MaxLimit = 80.0f;
public float DistanceSmooth = 0.05f;
private float velocityDistance = 0.0f;
private Vector3 desiredPosition = Vector3.zero;
public float X_Smooth = 0.05f;
public float Y_Smooth = 0.1f;
private float velX = 0.0f;
private float velY = 0.0f;
private float velZ = 0.0f;
private Vector3 position = Vector3.zero;
CursorLockMode wantedMode;
void Start (){
Distance = Mathf.Clamp(Distance, DistanceMin, DistanceMax);
startingDistance = Distance;
Reset();
SetCursorState();
OnGUI();
}
void LateUpdate (){
if (TargetLookAt == null)
return;
HandlePlayerInput();
CalculateDesiredPosition();
UpdatePosition();
}
void HandlePlayerInput (){
float deadZone= 0.01f; // mousewheel deadZone
//if (Input.GetMouseButton(1))
//{
mouseX += Input.GetAxis("Mouse X") * X_MouseSensitivity;
mouseY -= Input.GetAxis("Mouse Y") * Y_MouseSensitivity;
//}
// this is where the mouseY is limited - Helper script
mouseY = ClampAngle(mouseY, Y_MinLimit, Y_MaxLimit);
// get Mouse Wheel Input
if (Input.GetAxis("Mouse ScrollWheel") < -deadZone || Input.GetAxis("Mouse ScrollWheel") > deadZone)
{
desiredDistance = Mathf.Clamp(Distance - (Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity),
DistanceMin, DistanceMax);
}
}
void CalculateDesiredPosition (){
// Evaluate distance
Distance = Mathf.SmoothDamp(Distance, desiredDistance, velocityDistance, DistanceSmooth);
// Calculate desired position -> Note : mouse inputs reversed to align to WorldSpace Axis
desiredPosition = CalculatePosition(mouseY, mouseX, Distance);
}
float CalculatePosition ( float rotationX , float rotationY , float distance ){
Vector3 direction = new Vector3(0, 0, -distance);
Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0);
return TargetLookAt.position + (rotation * direction);
}
void UpdatePosition (){
float posX= Mathf.SmoothDamp(position.x, desiredPosition.x, velX, X_Smooth);
float posY= Mathf.SmoothDamp(position.y, desiredPosition.y, velY, Y_Smooth);
float posZ= Mathf.SmoothDamp(position.z, desiredPosition.z, velZ, X_Smooth);
position = new Vector3(posX, posY, posZ);
transform.position = position;
transform.LookAt(TargetLookAt);
}
void Reset (){
mouseX = 0;
mouseY = 10;
Distance = startingDistance;
desiredDistance = Distance;
}
float ClampAngle ( float angle , float min , float max ){
while (angle < -360 || angle > 360)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
}
return Mathf.Clamp(angle, min, max);
}
// Apply requested cursor state
void SetCursorState ()
{
Cursor.lockState = wantedMode;
// Hide cursor when locking
Cursor.visible = (CursorLockMode.Locked != wantedMode);
}
void OnGUI ()
{
GUILayout.BeginVertical ();
// Release cursor on escape keypress
if (Input.GetKeyDown (KeyCode.Escape))
Cursor.lockState = wantedMode = CursorLockMode.None;
switch (Cursor.lockState)
{
case CursorLockMode.None:
GUILayout.Label ("Cursor is normal");
if (GUILayout.Button ("Lock cursor"))
wantedMode = CursorLockMode.Locked;
if (GUILayout.Button ("Confine cursor"))
wantedMode = CursorLockMode.Confined;
break;
case CursorLockMode.Confined:
GUILayout.Label ("Cursor is confined");
if (GUILayout.Button ("Lock cursor"))
wantedMode = CursorLockMode.Locked;
if (GUILayout.Button ("Release cursor"))
wantedMode = CursorLockMode.None;
break;
case CursorLockMode.Locked:
GUILayout.Label ("Cursor is locked");
if (GUILayout.Button ("Unlock cursor"))
wantedMode = CursorLockMode.None;
if (GUILayout.Button ("Confine cursor"))
wantedMode = CursorLockMode.Confined;
break;
}
GUILayout.EndVertical ();
SetCursorState ();
}
}
线路上的错误:
Distance = Mathf.SmoothDamp(Distance, desiredDistance, velocityDistance, DistanceSmooth);
Error CS1502: The best overloaded method match for 'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword (CS1620) (Assembly-CSharp)
在线:
desiredPosition = CalculatePosition(mouseY, mouseX, Distance);
Error CS0029: Cannot implicitly convert type 'float' to 'UnityEngine.Vector3' (CS0029) (Assembly-CSharp)
在线:
return TargetLookAt.position + (rotation * direction);
Error CS0029: Cannot implicitly convert type 'UnityEngine.Vector3' to 'float' (CS0029) (Assembly-CSharp)
在线:
float posX= Mathf.SmoothDamp(position.x, desiredPosition.x, velX, X_Smooth);
Error CS1502: The best overloaded method match for 'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword (CS1620) (Assembly-CSharp)
在线:
float posY= Mathf.SmoothDamp(position.y, desiredPosition.y, velY, Y_Smooth);
Error CS1502: The best overloaded method match for 'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword (CS1620) (Assembly-CSharp)
在线:
float posZ= Mathf.SmoothDamp(position.z, desiredPosition.z, velZ, X_Smooth);
Error CS1502: The best overloaded method match for 'UnityEngine.Mathf.SmoothDamp(float, float, ref float, float)' has some invalid arguments (CS1502) (Assembly-CSharp)
Error CS1620: Argument 3 must be passed with the 'ref' keyword (CS1620) (Assembly-CSharp)
错误字面意思是:“必须使用 ref 关键字传递参数”。这意味着您必须将 ref 添加到参数中,以将参数标记为 in/out.
例如:
Distance = Mathf.SmoothDamp(Distance, desiredDistance, ref velocityDistance, DistanceSmooth);
对于您的函数 CalculatePosition
,您只是定义了错误的 return 类型。里面的代码不是 return 一个浮点数,它 return 是一个 Vector3,对于一个位置来说很自然。
/* Does not return a float! */
Vector3 CalculatePosition(float rotationX, float rotationY, float distance)
{
Vector3 direction = new Vector3(0, 0, -distance);
Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0);
return TargetLookAt.position + (rotation * direction);
}