如何在统一的js中修复操作错误

时间:2014-02-09 07:35:15

标签: android unity3d unityscript

嗨,我是业余程序员,我不知道修复此错误请帮助我,这是错误:

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平台时出错请帮我解决这个问题。

1 个答案:

答案 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