示例#1
0
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("CameraEdge"))
        {
            Destroy(gameObject);
            return;
        }
        Damageable damageable = other.GetComponent <Damageable> ();

        if (damageable != null)
        {
            damageable.TakeDamage(damageInflicted, this);

            Rigidbody2D rgbdy = damageable.GetComponent <Rigidbody2D> ();
            if (!damageable.CompareTag("Player"))
            {
                rgbdy.AddForceAtPosition(GetComponent <Rigidbody2D> ().velocity.normalized * 2f, transform.position);
            }
            else
            {
                rgbdy.AddForceAtPosition(GetComponent <Rigidbody2D> ().velocity.normalized * .1f, transform.position);
            }

            Destroy(gameObject);
        }
    }
示例#2
0
    void FixedUpdate()
    {
        targetRightX = transform.position.x + transform.localScale.x / 2f;
        targetLeftX  = transform.position.x - transform.localScale.x / 2f;

        targetY = transform.position.y + transform.localScale.y / 2f;

        var moveHorizontal = joystick.Horizontal;

        isGround = GroundColliders.Count > 0;

        if (moveHorizontal > 0.9f && isGround)
        {
            targetRight = new Vector3(targetRightX, targetY);
            body.AddForceAtPosition(Vector3.right * speed, targetRight);
            flip = 1;
        }

        if (moveHorizontal < -0.9f && isGround)
        {
            targetLeft = new Vector3(targetLeftX, targetY);
            body.AddForceAtPosition(Vector3.left * speed, targetLeft);
            flip = -1;
        }
        // Ограничение скорости
        if (Mathf.Abs(body.velocity.x) > speedLimit)
        {
            body.velocity = new Vector2(Mathf.Sign(body.velocity.x) * speedLimit, body.velocity.y);
        }

        if (Mathf.Abs(body.velocity.y) > jumpLimit)
        {
            body.velocity = new Vector2(body.velocity.x, Mathf.Sign(body.velocity.y) * jumpLimit);
        }
    }
示例#3
0
    void Update()
    {
        if (Input.GetKey(KeyCode.D))
        {
            rb.AddForce(Vector2.right * speed * Time.deltaTime, ForceMode2D.Force);
        }

        if (Input.GetKey(KeyCode.A))
        {
            rb.AddForce(Vector2.left * speed * Time.deltaTime, ForceMode2D.Force);
        }

        if (Input.GetKeyDown(KeyCode.W))
        {
            Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, radius);
            foreach (Collider2D collider in colliders)
            {
                if (collider.CompareTag("Ground") || collider.CompareTag("Wall"))
                {
                    rb.velocity = new Vector2(0f, jump_Force);
                    if (Input.GetKey(KeyCode.D))
                    {
                        rb.AddForceAtPosition(Vector2.right * speed * Time.deltaTime, transform.position, ForceMode2D.Force);
                    }

                    if (Input.GetKey(KeyCode.A))
                    {
                        rb.AddForceAtPosition(Vector2.left * speed * Time.deltaTime, transform.position, ForceMode2D.Force);
                    }
                }
            }
        }
    }
    void punch()
    {
        if (readyToAttack)
        {
            punching = true;

            Vector3 start = transform.position + transform.up;
            Vector3 end;

            if (facingRight)
            {
                end = start + punchReach * transform.right;
            }
            else
            {
                end = start + punchReach * -transform.right;
            }

            Vector2 punchDir = end - start;

            if (Physics2D.Linecast(start, end))
            {
                enemyrb.AddForceAtPosition(punchDir.normalized * punchPower, start);
                source.Play();
                JoScript.takeDamage(punchDamage);
            }
        }
    }
    void FixedUpdate()
    {
        if (controller.Inputs.LeftJet > 0)
        {
            rgdb.AddForceAtPosition(jetForce * naveDirection, t_leftJet.position);
        }
        if (controller.Inputs.RightJet > 0)
        {
            rgdb.AddForceAtPosition(jetForce * naveDirection, t_rightJet.position);
        }
        if (Mathf.Abs(rgdb.velocity.x) > 0.1f)
        {
            rgdb.velocity = Vector2.Lerp(rgdb.velocity, Vector2.up * rgdb.velocity, 0.01f);
        }

        if (rgdb.rotation > 80)
        {
            rgdb.rotation        = Mathf.Lerp(rgdb.rotation, 80, 0.01f);
            rgdb.angularVelocity = 0;
        }
        else if (rgdb.rotation < -80)
        {
            rgdb.rotation        = Mathf.Lerp(rgdb.rotation, -80, 0.01f);
            rgdb.angularVelocity = 0;
        }

        if (rgdb.rotation > controller.AngleTurnOffJet && !controller.OnEndLevelZone)
        {
            rgdb.velocity += naveFowardDirection * 0.015f;
        }
    }
示例#6
0
 private void FixedUpdate()
 {
     timeCounter -= Time.fixedDeltaTime;
     if (ComboManager.State == ComboManager.ComboState.BulletSpinClock)
     {
     }
     else if (ComboManager.State == ComboManager.ComboState.BulletSpinAntiC)
     {
     }
     else if (ComboManager.State == ComboManager.ComboState.ShieldStrike)
     {
     }
     else if (ComboManager.State == ComboManager.ComboState.ShipOfTheLine)
     {
     }
     //else if (ComboManager.State == ComboManager.ComboState.Fortress) {
     //}
     //else if (ComboManager.State == ComboManager.ComboState.SwordAndBoardP1) {
     //}
     //else if (ComboManager.State == ComboManager.ComboState.SwordAndBoardP2) {
     //}
     else if (nitroOn)
     {
         rigidbody.AddForceAtPosition(nitroThrust * transform.up, transform.position, ForceMode2D.Force);
     }
     else if (Input.GetAxis(player1 ? "p1 b" : "p2 b") > 0.01f)
     {
         rigidbody.AddForceAtPosition(thrust * transform.up, transform.position, ForceMode2D.Force);
     }
 }
示例#7
0
 private void FixedUpdate()
 {
     if (((Vector2)(CharacterControl.instance.transform.position - ForcePos.position)).sqrMagnitude < activeDistance * activeDistance)  //一定范围内攻击玩家
     {
         if (isHead)
         {
             if (isActive)
             {
                 Vector2 direction = ((Vector2)CharacterControl.instance.transform.position - (Vector2)ForcePos.position).normalized;
                 rig.AddForceAtPosition(direction * force, ForcePos.position);
             }
         }
         else
         {
             if (isActive)
             {
                 Vector2 direction = Vector3.Cross(((Vector2)CharacterControl.instance.transform.position - (Vector2)ForcePos.position).normalized, Vector3.back);
                 _time0 += Time.deltaTime;
                 if (_time0 < changeTime)
                 {
                     rig.AddForceAtPosition(direction * force, ForcePos.position);
                 }
                 else
                 {
                     _time0 = 0;
                     force  = 0 - force;
                 }
             }
         }
     }
 }
示例#8
0
    void Movement()
    {
        if (Input.GetKey(KeyCode.Q) || isPressedLeft)
        {
            rb.AddForceAtPosition(left_rocket.transform.up * thrust, left_rocket.transform.position);
            left_emitter.Play();
            timeStart = true;
        }

        if (Input.GetKey(KeyCode.P) || isPressedRight)
        {
            rb.AddForceAtPosition(right_rocket.transform.up * thrust, right_rocket.transform.position);
            right_emitter.Play();
            timeStart = true;
        }

        if (Input.GetKeyUp(KeyCode.Q))
        {
            left_emitter.Stop();
        }

        if (Input.GetKeyUp(KeyCode.P))
        {
            right_emitter.Stop();
        }



        if (Input.GetKey(KeyCode.W))
        {
            rb.AddForceAtPosition(right_rocket.transform.up * thrust, right_rocket.transform.position);
            rb.AddForceAtPosition(left_rocket.transform.up * thrust, left_rocket.transform.position);
        }
    }
 private void FixedUpdate()
 {
     if (this.isLocalPlayer && groundDetector.isTouchingGround)
     {
         rb.AddForceAtPosition(Vector2.right * moveForce, Vector2.zero);
     }
 }
示例#10
0
    void FixedUpdate()
    {
        var move = Input.GetAxis("Horizontal");

        //myRigidBody.AddForceAtPosition ();

        Vector2 impulse = new Vector2(0, -move);

        if (move < 0)
        {
            myRigidBody.AddForceAtPosition(-impulse, leftPushDownOffset);
        }
        else
        {
            myRigidBody.AddForceAtPosition(impulse, rightPushDownOffset);
        }


        //Debug.DrawLine(Vector3.zero+leftPushDownOffSet, Vector3.zero+leftPushDownOffSet +

#if UNITY_EDITOR
        if (move < 0)
        {
            Debug.DrawLine(leftPushDownOffset, leftPushDownOffset - impulse);
        }
        else
        {
            Debug.DrawLine(rightPushDownOffset, rightPushDownOffset + impulse);
        }
#endif
    }
示例#11
0
    void Movement()
    {
        if (Input.GetKey(KeyCode.A))
        {
            rb.AddForceAtPosition(left_rocket.transform.up * thrust, left_rocket.transform.position);
            left_emitter.Play();
            leftThrust.SetActive(true);
        }

        if (Input.GetKey(KeyCode.L))
        {
            rb.AddForceAtPosition(right_rocket.transform.up * thrust, right_rocket.transform.position);
            right_emitter.Play();
            rightThrust.SetActive(true);
        }


        if (Input.GetKeyUp(KeyCode.A))
        {
            left_emitter.Stop();
            leftThrust.SetActive(false);
        }

        if (Input.GetKeyUp(KeyCode.L))
        {
            right_emitter.Stop();
            rightThrust.SetActive(false);
        }
    }
示例#12
0
    // Update is called once per frame
    void Update()
    {
        // Get input for thrusters
        leftThrusterInput  = Input.GetAxis("Left Thruster");
        rightThrusterInput = Input.GetAxis("Right Thruster");

        // Increase angular drag if both thrusters active
        rb2d.angularDrag = (leftThrusterInput > 0 && rightThrusterInput > 0 ? increasedAngularDrag : angularDrag);

        // Increase linear drag if both thursters active
        // rb2d.drag = (leftThrusterInput > 0 && rightThrusterInput > 0 ? increasedLinearDrag : linearDrag);

        // Handle left thruster input
        if (leftThrusterInput > 0)
        {
            rb2d.AddForceAtPosition(transform.up * (thrusterForce * leftThrusterInput), leftThrusterPosition.transform.position);
        }
        animator.SetBool("Left Thruster Active", leftThrusterInput > 0);

        // Handle right thruster input
        if (rightThrusterInput > 0)
        {
            rb2d.AddForceAtPosition(transform.up * (thrusterForce * rightThrusterInput), rightThrusterPosition.transform.position);
        }
        animator.SetBool("Right Thruster Active", rightThrusterInput > 0);

        // Let the game manager know the player has started the current level
        if ((leftThrusterInput > 0 || rightThrusterInput > 0) && GameManager.instance.hasStartedCurrentLevel == false)
        {
            GameManager.instance.hasStartedCurrentLevel = true;
        }
    }
示例#13
0
    void FixedUpdate()
    {
        if (GetComponent <Health>().health > 0)
        {
            Vector2 dir = new Vector2();
            dir.x = Mathf.Cos(Mathf.Deg2Rad * (transform.eulerAngles.z + 90));
            dir.y = Mathf.Sin(Mathf.Deg2Rad * (transform.eulerAngles.z + 90));
            if (!onGround)
            {
                if (transform.eulerAngles.z > 30 && transform.eulerAngles.z < 180)
                {
                    float dif = (transform.eulerAngles.z - 30) * Time.fixedDeltaTime;
                    rb.AddForceAtPosition(dir * Mathf.Min(MovementForce, dif * CorrectionStrength), LeftProp.transform.position);
                }

                if (transform.eulerAngles.z < 330 && transform.eulerAngles.z > 180)
                {
                    float dif = (330 - transform.eulerAngles.z) * Time.fixedDeltaTime;
                    rb.AddForceAtPosition(dir * Mathf.Min(MovementForce, dif * CorrectionStrength), RightProp.transform.position);
                }
            }
            if (Input.GetKey(MoveLeft))
            {
                rb.AddForceAtPosition(dir * MovementForce, RightProp.transform.position);
            }
            if (Input.GetKey(MoveRight))
            {
                rb.AddForceAtPosition(dir * MovementForce, LeftProp.transform.position);
            }
            if (Input.GetKey(SelfDestruct))
            {
                GetComponent <Health>().hurt(10000);
            }
        }
    }
示例#14
0
    public void toppleLeftByRat(float force)
    {
        Vector2 rightCircleVector = rightCircle.transform.position;

        trophyRigid.AddForceAtPosition(Vector2.left * force * 1.5f, rightCircleVector);
        isMoving = true;
    }
示例#15
0
    void FixedUpdate()
    {
        Debug.DrawRay(_spaceRigidbody.position, _engineForceVector * 10, Color.red);

        _spaceRotationZ = transform.rotation.eulerAngles.z;

        _engineForceVector.x = (Mathf.Sin(_spaceRotationZ * Mathf.PI / 180)) * -1;
        _engineForceVector.y = Mathf.Cos(_spaceRotationZ * Mathf.PI / 180);

        #region KeyEvents

        if (Input.GetKey(KeyCode.F) && Input.GetKey(KeyCode.J) || Input.GetKey(KeyCode.Space))
        {
            _spaceRigidbody.AddForceAtPosition(_engineForceVector * EnginePower * 2, _spaceRigidbody.position, ForceMode2D.Force);
        }

        if (Input.GetKey(KeyCode.J) && !Input.GetKey(KeyCode.F))
        {
            _spaceRigidbody.AddForceAtPosition(_engineForceVector * EnginePower, RightEngineTransform.position, ForceMode2D.Force);
        }

        if (Input.GetKey(KeyCode.F) && !Input.GetKey(KeyCode.J))
        {
            _spaceRigidbody.AddForceAtPosition(_engineForceVector * EnginePower, LeftEngineTransform.position, ForceMode2D.Force);
        }

        #endregion
    }
        public static void AddExplosionForceAtPosition(this Rigidbody2D body, Vector2 bodyPosition, float explosionForce, Vector2 explosionPosition, float explosionRadius, bool applyWearOff, ForceMode2D mode)
        {
            var delta = (body.position - explosionPosition);
            var dist  = delta.magnitude;

            if (dist > 0f)
            {
                if (applyWearOff)
                {
                    float wearoff = 1 - (dist / explosionRadius);
                    if (wearoff > 0f)
                    {
                        var     dir       = delta / dist;
                        Vector3 baseForce = dir * (explosionForce * wearoff);
                        body.AddForceAtPosition(baseForce, bodyPosition, mode);
                    }
                }
                else
                {
                    var     dir       = delta / dist;
                    Vector3 baseForce = dir * explosionForce;
                    body.AddForceAtPosition(baseForce, bodyPosition, mode);
                }
            }
        }
示例#17
0
    void OnCollisionEnter2D(Collision2D col)
    {
        Rigidbody2D subject = col.collider.gameObject.GetComponent <Rigidbody2D> ();

        if (subject != null)
        {
            ContactPoint2D c    = col.contacts[0];
            Vector2        away = (col.collider.gameObject.transform.position - transform.position).normalized;

            Ship s = subject.GetComponent <Ship> ();
            if (s != null)
            {
                s.RandomTalk();
                // figure out if shielder is active on the ship, skip the collision if so.
                if (s.IsShieldedTowards(c.normal))
                {
                    body.AddForceAtPosition(-away * selfbounce, c.point, ForceMode2D.Impulse);
                    shieldedSFX.Play();
                    stuntimer = 10f;
                    return;
                }
            }

            stuntimer = .25f;
            subject.AddForceAtPosition(away * pushaway, c.point, ForceMode2D.Impulse);
            body.AddForceAtPosition(-away * selfbounce, c.point, ForceMode2D.Impulse);
            bounceSFX.Play();
        }
    }
示例#18
0
    public void State_UpdateMoveToPos()
    {
        _dir = _destPos - transform.position;

        //--------------------------------

        //--------------------------------

        //_rb2d.AddForce (_dir, ForceMode2D.Force); // == force
        //_rb2d.AddForce (_dir.normalized * 15, ForceMode2D.Force);
        //_rb2d.AddForceAtPosition(_dir.normalized * 20, _destPos, ForceMode2D.Force);

//		_rb2d.angularVelocity = 0f;
//		_rb2d.angularDrag = 0f;
//		_rb2d.drag = 0f;

        if (Cat.eMove.Normal == _moveMode)
        {
            //--------------------------------
            //liner moving
            _rb2d.MovePosition(transform.position + (_destPos - transform.position) * 0.1f);
        }
        if (Cat.eMove.JumpFly == _moveMode)
        {
            this.ControlLayer_Falling();

            S_State_UpdateMoveToPos_sumTime += Time.deltaTime;
            if (S_State_UpdateMoveToPos_sumTime > 0.3f)
            {
                this.gameObject.layer = GlobalConstants.Layer.Num.superCat;
                this.s_ControlLayer_Falling.Init(transform);
                S_State_UpdateMoveToPos_sumTime = 0;
            }

            //_rb2d.AddForce (_dir * 2, ForceMode2D.Impulse);
            if (_rb2d.velocity.sqrMagnitude <= 20.8f)
            {
                _rb2d.AddForce(_dir, ForceMode2D.Impulse);                  // ++ force
            }
            else
            {
                _rb2d.AddForce(_dir, ForceMode2D.Force);                   // == force
            }
        }
        if (Cat.eMove.JumpRush == _moveMode)
        {
            _rb2d.AddForceAtPosition(_dir, _destPos, ForceMode2D.Impulse);
        }
        if (Cat.eMove.Super == _moveMode)
        {
            _rb2d.MovePosition(transform.position + (_destPos - transform.position) * 0.2f);
        }
        if (Cat.eMove.Ninja == _moveMode)
        {
            //--------------------------------
            //순간이동 닌자 느낌
            _rb2d.MovePosition(_destPos);
        }
    }
 public override void AddForce(Vector3 force)
 {
     if (!HasRigidbody())
     {
         return;
     }
     rigidbody.AddForceAtPosition(force, collider.bounds.center);
 }
示例#20
0
 // Update is called once per frame
 void Update()
 {
     if (isSimulating)
     {
         leverRB.AddForceAtPosition(loadForce, loadIcon.transform.position);
         leverRB.AddForceAtPosition(effortForce, effortIcon.transform.position);
     }
 }
示例#21
0
 public void NoInput()
 {
     if (!IsGrounded())
     {
         rig.AddForceAtPosition((-Vector2.right + Vector2.up) * accelerationSpeed * 0.25f * Time.deltaTime,
                                wheels[1].connectedBody.transform.position);
     }
 }
示例#22
0
    // Update is called once per frame
    void FixedUpdate()
    {
        car.AddForceAtPosition(-transform.up * moveSpeed, motor.position);
        car.AddForceAtPosition(-transform.up * moveSpeed, wheels.position);


        Turn(Input.GetAxis("Horizontal"));
    }
示例#23
0
    public void fireLeftThruster(float thrustAmount)
    {
        //rigidBody.AddForceAtPosition(new Vector2(0, fuelLines(sideThrusterPower, thrustAmount)), new Vector2(-10, 10));
        float power = fuelLines(sideThrusterPower, thrustAmount);

        power = power > 0 ? power : 0;
        rigidBody.AddForceAtPosition(new Vector2(leftThruster.up.x * power, leftThruster.up.y * power), leftThruster.position);
    }
示例#24
0
    void FixedUpdate()
    {
        lastLength = springLength;

        RaycastHit2D hit = Physics2D.Raycast(wheelPoint.position, -wheelPoint.up, rideHeight);

        if (hit.collider != null)
        {
            springCompression       = Vector2.Distance(wheelPoint.position + (-wheelPoint.up * minLength), hit.point) / rideHeight;
            springCompression       = springCompression - 1;
            springCompression       = Mathf.Abs(springCompression);
            springLength            = Vector2.Distance(wheelPoint.position + (-wheelPoint.up * minLength), hit.point);
            wheelTransform.position = hit.point + (new Vector2(wheelPoint.up.x, wheelPoint.up.y) * tireRadius);
            isGrounded = true;
        }
        else
        {
            springCompression       = 0f;
            springLength            = rideHeight;
            wheelTransform.position = wheelPoint.position + (-wheelPoint.up * (rideHeight - tireRadius));
            isGrounded = false;
        }

        springVelocity = (lastLength - springLength) / Time.fixedDeltaTime;
        damperForce    = damperStiffness * springVelocity;

        Vector3 localVel = transform.InverseTransformDirection(planeRB.velocity);

        planeRB.AddForceAtPosition((wheelPoint.up * springCompression * (springForce + damperForce)), wheelPoint.position);

        if (brakingWheel && isGrounded)
        {
            if (isBraking)
            {
                planeRB.AddForceAtPosition(planeRB.transform.right * Mathf.Lerp(actualBrakeForce, -planeRB.velocity.normalized.x * brakeForce, .1f), wheelGraphicsTransform.position);
            }
            else
            {
                actualBrakeForce = Mathf.Lerp(actualBrakeForce, 0f, .1f);
            }
        }

        float tireCircumference      = 2 * Mathf.PI * tireRadius;
        float speedInMetersPerMinute = planeRB.velocity.magnitude * 6;
        float rotations = speedInMetersPerMinute / tireCircumference;

        if (isGrounded)
        {
            wheelTransform.Rotate(new Vector3(0f, 0f, rotations * -planeRB.velocity.normalized.x));
        }

        if (Mathf.Abs(lastFramePlaneYVel) > planeController.destroyVel && isGrounded)
        {
            planeController.isDestroyed = true;
        }

        lastFramePlaneYVel = planeRB.velocity.y;
    }
    public void Forces()
    {
        Vector2 force = Vector2.ClampMagnitude(targetPos * multiplier, clamp) * CanMove;

        if (body.GetRelativePointVelocity(forcePoint).magnitude < maxSpeed)
        {
            body.AddForceAtPosition(force, ForcePoint, ForceMode2D.Impulse);
        }
    }
示例#26
0
    void Jump()
    {
        jumpEffect.Show(
            new Vector3(transform.position.x + 1.31f, transform.position.y + 1.13705f, 0.0f));



        rigidbody2d.AddForceAtPosition(new Vector2(0.0f, 3.0f) * jumpVelocity, rigidbody2d.position, ForceMode2D.Force);
    }
示例#27
0
    // Update is called once per frame
    void Update()
    {
        if (!Enabled)
        {
            return;
        }
        _CalculateRotationState();
        _CalculateAngle();

        var position1 = _corner1.Transform.position;

        Debug.DrawLine(
            position1,
            position1 + new Vector3(_corner1.Target.x, _corner1.Target.y),
            Color.red
            );
        var position2 = _corner2.Transform.position;

        Debug.DrawLine(
            position2,
            position2 + new Vector3(_corner2.Target.x, _corner2.Target.y),
            Color.green
            );
        isGrounded = IsGrounded();
        var now = Time.time;

        if (isGrounded || TimePassedForJump(now))
        {
            if (Input.GetKeyDown(KeyCode.A) || Input.GetMouseButtonDown(0))
            {
                secondJump = isGrounded;
                _lastJump  = now;
                _rigidBody2D.AddForceAtPosition(_corner1.Target, position1, ForceMode2D.Impulse);
                _corner1.Particles.Play();
                AudioManager.instance.PlaySound(jumpSound);
            }

            else if (Input.GetKeyDown(KeyCode.D) || Input.GetMouseButtonDown(1))
            {
                secondJump = isGrounded;
                _lastJump  = now;
                _rigidBody2D.AddForceAtPosition(_corner2.Target, position2, ForceMode2D.Impulse);
                _corner2.Particles.Play();
                AudioManager.instance.PlaySound(jumpSound);
            }

            // Reset position to last checkpoint.
            if (Input.GetKeyDown(KeyCode.R))
            {
                if (now > _resetTimer + resetCooldown)
                {
                    _racer.SpawnInLastCheckpoint();
                    _resetTimer = now;
                }
            }
        }
    }
示例#28
0
    void ApplyRandomForce()
    {
        direction = transform.localPosition * 0.1f - Vector3.zero;
        Rigidbody2D rb = GetComponent <Rigidbody2D> ();

        rb.AddForceAtPosition(_ForcePower * Random.insideUnitCircle, _ForceOffset * Random.insideUnitCircle);                 //单位圆里的随机点
        rb.AddForceAtPosition(-direction * 5.0f, new Vector2(10, 0));
        //rb.AddForce (_ForcePower * Random.insideUnitCircle );
    }
示例#29
0
    public void FixedUpdate()
    {
        if (!isAlive)
        {
            rb.velocity = Vector2.zero;
            return;
        }

        float adjustedPowerBoost = powerBoost;

        float adjustedLeftThrust  = leftThrust - 0.5f;
        float adjustedRightThrust = rightThrust - 0.5f;

        if (Time.time - slowingDownStart > 1.0f)
        {
            slowingDown = false;
        }

        // Discourage behaviour that causes rapid change of direction.
        float[] signNow = { Mathf.Sign(adjustedLeftThrust), Mathf.Sign(adjustedRightThrust) };
        if (lastSign.SequenceEqual(signNow))
        {
            sameSign += 1;
        }
        else
        {
            if (sameSign < changeTolerance || signNow.Reverse().SequenceEqual(lastSign))
            {
                adjustedPowerBoost *= slowDownFactor;
                slowingDown         = true;
                slowingDownStart    = Time.time;
            }
            sameSign = 0;
        }
        lastSign = signNow;

        float   leftPower  = powerBoost * adjustedLeftThrust;
        float   rightPower = powerBoost * adjustedRightThrust;
        Vector2 leftForce  = transform.up * leftPower;
        Vector2 rightForce = transform.up * rightPower;

        rb.AddForceAtPosition(leftForce, BLwheel.position, ForceMode2D.Force);
        rb.AddForceAtPosition(leftForce, FLwheel.position, ForceMode2D.Force);

        rb.AddForceAtPosition(rightForce, BRwheel.position, ForceMode2D.Force);
        rb.AddForceAtPosition(rightForce, FRwheel.position, ForceMode2D.Force);

        if (rb.angularVelocity > maxAngularVelocity)
        {
            rb.angularVelocity = maxAngularVelocity;
        }
        else if (rb.angularVelocity < -maxAngularVelocity)
        {
            rb.angularVelocity = -maxAngularVelocity;
        }
    }
示例#30
0
 private void FixedUpdate()
 {
     //        Debug.Log(transform.InverseTransformDirection(rb.velocity));
     if (isFlying)
     {
         float factor = transform.InverseTransformDirection(rb.velocity).y *transform.InverseTransformDirection(rb.velocity).x / windForce;
         rb.AddForceAtPosition(new Vector2(0, -windForce * Time.deltaTime * factor), new Vector2(-0.2f, 0));
         rb.AddForceAtPosition(new Vector2(0, windForce * Time.deltaTime * factor), Vector2.zero);
     }
 }