嗨,我是业余程序员,我不知道修复此错误请帮助我,这是错误:
BCE0051:操作符' - '不能与'Object'类型的左侧和'float'类型的右侧一起使用。
和unity在这一行完整代码中有错误:
trickPoints[0] -=pointsToAdd;
这是我的完整代码:
var rotateSpeed = 90;
var inAirRotateScale = 2;
var oneEightyThreshold = 0.8;
var accelerometerScale = 2;
var swipeThreshold = 15;
var pedalImpulse = 3.5;
var maxSpeed = 12;
var decayRate = 0.1;
var olliePoints = 5;
var kickflipPoints = 10;
var verticalPoints = 10;
var oneEightyPoints = 15;
var raycastMask : LayerMask;
var skatingLoopSound : AudioClip;
var pedalSound : AudioClip;
var ollieSound : AudioClip;
var fallSound : AudioClip;
var fallAltSound : AudioClip;
var debugGUI = false;
var font : Font;
var bigFont : Font;
var buttonTex : Texture2D;
private var character : CharacterController;
private var speed = 0.0;
private var hangSpeed = 0.0;
private var trans : Transform;
private var skater : Transform;
private var anim : Animation;
private var targetForward : Vector3;
private var targetRight : Vector3;
private var targetRot : Quaternion;
private var needsRestart = false;
private var fingerDownTime = -1;
private var fingerDownPos = Vector2.zero;
private var points = 0.0;
private var trickPoints = new Array();
private var trickLabel = new Array();
private var labelOffset = 0.0;
private var vertical = false;
private var loopAudio : AudioSource;
private var trickAudio : AudioSource;
private var labelStyle : GUIStyle;
private var bigLabelStyle : GUIStyle;
private var boxStyle : GUIStyle;
private var pedalButtonStyle : GUIStyle;
private var vertRotation : float;
enum InstructionOrder
{
PEDAL,
OLLIE,
KICKFLIP,
DONE
};
private var showInstructions = true;
private var keyInstructions = [
"Hit SPACE to pedal",
"Press DOWN to ollie",
"Press UP to kickflip"
];
private var touchInstructions = [
"TAP to pedal",
"SWIPE DOWN to ollie",
"SWIPE UP to kickflip"
];
private var currentInstruction = InstructionOrder.PEDAL;
function Start() {
character = GetComponent(CharacterController);
trans = transform;
skater = gameObject.Find("Skater").transform;
anim = skater.GetComponent(Animation);
anim.wrapMode = WrapMode.Default;
targetForward = trans.forward;
loopAudio = gameObject.AddComponent(AudioSource);
loopAudio.playOnAwake = false;
loopAudio.clip = skatingLoopSound;
loopAudio.volume = 0;
loopAudio.loop = true;
trickAudio = gameObject.AddComponent(AudioSource);
#if UNITY_IPHONE || UNITY_ANDROID
// Unity likes to default autorotate to on for some reason
#endif
}
function OnGUI() {
if (!labelStyle)
{
labelStyle = new GUIStyle(GUI.skin.label);
labelStyle.font = font;
}
if (!boxStyle)
{
boxStyle = new GUIStyle(GUI.skin.box);
boxStyle.font = font;
}
if (!bigLabelStyle)
{
bigLabelStyle = new GUIStyle(GUI.skin.label);
bigLabelStyle.alignment = TextAnchor.MiddleCenter;
bigLabelStyle.font = bigFont;
}
if (!pedalButtonStyle)
{
pedalButtonStyle = new GUIStyle(GUI.skin.label);
pedalButtonStyle.alignment = TextAnchor.MiddleCenter;
pedalButtonStyle.font = font;
pedalButtonStyle.normal.background = buttonTex;
}
if (needsRestart)
{
GUILayout.Box("Points: " + Mathf.FloorToInt(points), boxStyle);
if (GUI.Button(new Rect(0, 0, Screen.width, Screen.height), "Replay", bigLabelStyle))
{
needsRestart = false;
points = 0;
}
return;
}
if (showInstructions)
{
#if UNITY_IPHONE || UNITY_ANDROID
var instructions = touchInstructions;
#else
var instructions = keyInstructions;
#endif
GUI.Label(new Rect(0, 0, Screen.width, Screen.height), instructions[currentInstruction], bigLabelStyle);
return;
}
GUILayout.Box("Points: " + Mathf.FloorToInt(points).ToString(), boxStyle);
if (trickPoints.Count > 0)
{
GUI.color = Color.green;
GUILayout.BeginArea(new Rect(0, 20 + labelOffset, 200, 40));
// Have to assign this to a local variable, otherwise AOT will skip it and it won't run on mobile.
var trick : String = trickLabel[0];
GUILayout.Label(trick, labelStyle);
GUILayout.EndArea();
GUI.color = Color.white;
}
#if UNITY_IPHONE || UNITY_ANDROID
var buttonSize = 76;
var buffer = 32;
if (GUI.Button(new Rect(Screen.width - buttonSize - buffer, Screen.height - buttonSize - buffer, buttonSize, buttonSize),
"PEDAL", pedalButtonStyle))
Pedal();
#endif
if (debugGUI)
{
GUILayout.Box("Velocity: " + character.velocity);
GUILayout.Box("Speed: " + speed);
GUILayout.Box("Hang Speed: " + hangSpeed);
GUILayout.Box("Upright: " + Vector3.Dot(Vector3.up, targetForward));
#if UNITY_IPHONE || UNITY_ANDROID
GUILayout.Label(Input.acceleration.ToString());
if (Input.touchCount > 0)
{
var touch = Input.GetTouch(0);
GUILayout.Label(touch.position.ToString());
GUILayout.Label(touch.deltaPosition.ToString());
GUILayout.Label((touch.position - touch.deltaPosition).ToString());
}
#endif
}
}
function OnControllerColliderHit (hit : ControllerColliderHit) {
if (Vector3.Dot(hit.normal, trans.forward) < -0.98
&& speed > maxSpeed * 0.5
&& !IsDoingTrick() )
{
Fall();
}
}
function IsDoingTrick()
{
return anim.IsPlaying("ollie") || anim.IsPlaying("ollie_flip");
}
function Fall()
{
// Make sure the skater is facing the right way first
skater.forward = trans.forward;
anim.Play("fall");
trickPoints = new Array();
trickLabel = new Array();
needsRestart = true;
loopAudio.Stop();
if (Random.value < 0.5)
trickAudio.PlayOneShot(fallSound);
else
trickAudio.PlayOneShot(fallAltSound);
}
function Ollie()
{
if (Mathf.Abs(speed) <= maxSpeed * 0.1f
|| IsDoingTrick())
return;
var addPoints = olliePoints;
var prefix = "";
if (vertical)
{
addPoints *= 2;
prefix = "VERT ";
}
trickPoints.Add(addPoints);
trickLabel.Add(prefix + "OLLIE! +" + addPoints);
anim.CrossFade("ollie");
anim.CrossFadeQueued("Take 001");
// Don't play the sound if we're already in the air
if (!vertical)
trickAudio.PlayOneShot(ollieSound);
if (showInstructions && currentInstruction == InstructionOrder.OLLIE)
currentInstruction = InstructionOrder.KICKFLIP;
}
function Kickflip()
{
if (Mathf.Abs(speed) <= maxSpeed * 0.25f
|| IsDoingTrick())
return;
var addPoints = kickflipPoints;
var prefix = "";
if (vertical)
{
addPoints *= 2;
prefix = "VERT ";
}
trickPoints.Add(addPoints);
trickLabel.Add(prefix + "KICKFLIP! +" + addPoints);
anim.CrossFade("ollie_flip");
anim.CrossFadeQueued("Take 001");
// Don't play the sound if we're already in the air
if (!vertical)
trickAudio.PlayOneShot(ollieSound);
if (showInstructions && currentInstruction == InstructionOrder.KICKFLIP)
currentInstruction = InstructionOrder.DONE;
}
function Pedal()
{
if (IsDoingTrick())
return;
speed += pedalImpulse;
speed = Mathf.Min(speed, maxSpeed);
anim.Stop();
if (speed > 0.1)
anim.Play("pedaling_feet_up");
else
anim.Play("pedaling_board_up");
anim.CrossFadeQueued("Take 001");
if (!loopAudio.isPlaying)
loopAudio.Play();
trickAudio.PlayOneShot(pedalSound);
if (showInstructions && currentInstruction == InstructionOrder.PEDAL)
currentInstruction = InstructionOrder.OLLIE;
}
function Update () {
if (needsRestart)
{
speed = 0;
return;
}
var swipeUp = false;
var swipeDown = false;
var tap = false;
if (Input.touchCount > 0)
{
var touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
fingerDownTime = Time.time;
fingerDownPos = touch.position;
}
if ((touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
&& fingerDownTime < 0)
{
fingerDownTime = Time.time;
fingerDownPos = touch.position;
}
else if (touch.phase == TouchPhase.Ended)
{
if ((fingerDownPos.y - touch.position.y) > swipeThreshold)
{
// Debug.Log("SWIPE DOWN: " + (fingerDownPos.y - touch.position.y));
swipeDown = true;
}
else if ((fingerDownPos.y - touch.position.y) < -swipeThreshold)
{
// Debug.Log("SWIPE UP: " + (fingerDownPos.y - touch.position.y));
swipeUp = true;
}
else
{
// Debug.Log("TAP: " + (Time.time - fingerDownTime));
tap = true;
}
fingerDownTime = -1;
}
}
if ( character.isGrounded && (Input.GetKeyDown(KeyCode.Space) || tap))
Pedal();
// Duck the looping audio when pedaling, so we can hear the push sound
if (vertical)
loopAudio.volume = 0.0;
else if (anim.IsPlaying("Take 001"))
loopAudio.volume = 1.0;
else
loopAudio.volume = 0.75;
// You get points for just staying alive
points += Time.deltaTime * speed;
// Add trickPoints to points
if (trickPoints.Count > 0)
{
var pointsToAdd : float = trickPoints[0];
pointsToAdd = Mathf.Min(Time.deltaTime * 10.0f, pointsToAdd);
points += pointsToAdd;
trickPoints[0] -=pointsToAdd;
labelOffset += pointsToAdd;
if (trickPoints[0] <= 0)
{
labelOffset = 0;
trickPoints.RemoveAt(0);
trickLabel.RemoveAt(0);
}
}
if (Input.GetKeyUp(KeyCode.DownArrow) || swipeDown)
Ollie();
if (Input.GetKeyUp(KeyCode.UpArrow) || swipeUp)
Kickflip();
var horizontal = Input.GetAxis ("Horizontal");
horizontal += -Input.acceleration.y * accelerometerScale;
if (vertical)
{
var toRotate = horizontal * rotateSpeed * inAirRotateScale * Time.deltaTime;
vertRotation += Mathf.Abs(toRotate);
skater.Rotate(0, toRotate, 0);
}
else
trans.Rotate(0, horizontal * rotateSpeed * Time.deltaTime, 0);
var moveDirection = trans.forward * speed;
var upright = Vector3.Dot(Vector3.up, trans.forward);
// We have to fake gravity when the character is vertical, since the CharacterController doesn't rotate
moveDirection += Vector3.Lerp(Physics.gravity, Mathf.Sign(upright) * -trans.forward * Physics.gravity.magnitude,
Mathf.Clamp01(Mathf.Abs(upright)));
if (Vector3.Dot(Vector3.up, targetForward) >= 0.6
&& speed > maxSpeed * 0.6
&& !vertical)
{
vertical = true;
vertRotation = 0;
var addPoints = verticalPoints;
trickPoints.Add(addPoints);
trickLabel.Add("VERT! +" + addPoints);
trickAudio.PlayOneShot(ollieSound);
vertOriginalRot = skater.rotation;
}
if ( vertical )
{
moveDirection = Vector3.up * speed;
speed -= Time.deltaTime * Physics.gravity.magnitude;
}
character.Move(moveDirection * Time.deltaTime);
if ( vertical && character.isGrounded )
{
vertical = false;
trans.forward = -trans.forward;
speed *= -1;
var skaterRot = Vector3.Dot(trans.forward, skater.forward);
if (Mathf.Abs(skaterRot) < oneEightyThreshold)
Fall();
else if (vertRotation > 180.0 * oneEightyThreshold)
{
var multiplier = Mathf.Round(vertRotation / 180.0);
// Player successfully rotated around
addPoints = oneEightyPoints * multiplier;
trickPoints.Add(addPoints);
trickLabel.Add(String.Format("{0}! +{1}", 180 * multiplier, addPoints));
}
skater.forward = trans.forward;
}
var ray = new Ray(trans.position + Vector3.up, -Vector3.up);
var hit : RaycastHit;
if (Physics.Raycast(ray, hit, 100, raycastMask))
{
targetRight = Vector3.Cross(hit.normal, trans.forward);
targetForward = Vector3.Cross(targetRight, hit.normal);
if ( character.isGrounded )
targetRot = Quaternion.LookRotation(targetForward, hit.normal);
}
Debug.DrawRay(trans.position, targetRight * 10, Color.green);
Debug.DrawRay(trans.position, targetForward * 10, Color.red);
trans.rotation = Quaternion.Slerp(trans.rotation, targetRot, Time.deltaTime * 5);
if ( character.isGrounded )
{
// Stop the character when he has slowed down enough
if (Mathf.Abs( speed ) <= 0.3)
{
speed = 0;
anim.Play("standing_board_up");
loopAudio.Stop();
}
else
// Simple friction to slow character down
speed -= decayRate * Time.deltaTime * speed;
}
if (currentInstruction == InstructionOrder.DONE)
showInstructions = false;
}
但是此代码只在pc平台上运行并且在切换到android平台时出错请帮我解决这个问题。
答案 0 :(得分:0)
它说左边的任何内容(trickPoints[0]
)都不是浮点数或任何可以应用-
运算符的东西。它说这是一个对象。
这意味着你有一个类型问题,在某个地方,它永远不会被定义为一个浮点数,实际上你的数组声明只是private var trickPoints = new Array();
,所以我们不知道你将要投入什么它。
您可以尝试将其转换为浮动,如下所示:
trickPoints[0] = (float)trickPoints[0] - pointsToAdd;
但这只是对真正问题的一种限制。不知何故,你需要弄清楚为什么它不认为它是一个浮点数,或者你需要使你的声明类型具体。
Here's the array docs,在他们宣布检查员可以看到数组的示例中,他们这样做:
var values : float[];
哪个explcitly说“这是一个花车阵列”所以你可能想要这样做:
var trickPoints : float[] = new Array(); // <== not sure if that will compile because of the = new Array() part, but you can probably instantiate that in the Start() method or wherever your entry point is