Ejemplo n.º 1
0
    public void Initialize(ShipBase target, Item missileItem)
    {
        _stage                = MissileStage.None;
        Target                = target;
        MaxSpeed              = missileItem.GetFloatAttribute("Max Speed");
        Damage                = new Damage();
        Damage.DamageType     = (DamageType)Enum.Parse(typeof(DamageType), missileItem.GetStringAttribute("Damage Type"));
        Damage.ShieldAmount   = missileItem.GetFloatAttribute("Shield Damage");
        Damage.HullAmount     = missileItem.GetFloatAttribute("Hull Damage");
        BlastRadius           = missileItem.GetFloatAttribute("Blast Radius");
        DetonationRadius      = missileItem.GetFloatAttribute("Detonation Radius");
        TurnRate              = missileItem.GetFloatAttribute("Turn Rate");
        Acceleration          = missileItem.GetFloatAttribute("Acceleration");
        LaunchedStageDuration = missileItem.GetFloatAttribute("Ignition Delay");
        _rigidbody            = transform.GetComponent <Rigidbody>();

        Collider collider = transform.GetComponent <Collider>();

        if (collider != null)
        {
            collider.enabled = false;
        }
    }
Ejemplo n.º 2
0
    void FixedUpdate()
    {
        if (_stage == MissileStage.Launched)
        {
            //if(_age > 0.3f)
            if (_age > LaunchedStageDuration)
            {
                _stage = MissileStage.Chasing;
                LoadEngineFlame();
                Collider collider = transform.GetComponent <Collider>();
                if (collider != null)
                {
                    collider.enabled = true;
                }
                AudioSource audio = GetComponent <AudioSource>();
                if (audio != null)
                {
                    audio.Play();
                }
            }
        }
        else if (_stage == MissileStage.Chasing)
        {
            if (Target == null)
            {
                _force = Acceleration;                //5f;
                _rigidbody.AddForce(transform.forward * _force);
            }
            else
            {
                Vector3 targetPos = Target.transform.position;
                if (Target.CurrentCountermeasure != null)
                {
                    CounterMeasureFlares flares = Target.CurrentCountermeasure.GetComponentInChildren <CounterMeasureFlares>();
                    if (flares != null && flares.IsEffective)
                    {
                        targetPos += flares.MissileDeviation;
                    }
                }

                Vector3 aimPoint = StaticUtility.FirstOrderIntercept(transform.position, _rigidbody.velocity,
                                                                     _rigidbody.velocity.magnitude, targetPos, Target.RB.velocity);
                Vector3 los = aimPoint - transform.position;

                if (Vector3.Angle(los, transform.forward) < 10)
                {
                    _force = Acceleration;                    //5f
                    //here we need to reduce torque so it stops turning
                }
                else
                {
                    //AddLookTorque(los);
                    Vector3 lookDir = Vector3.RotateTowards(transform.forward, los, 1f * Time.fixedDeltaTime, 0f);
                    transform.rotation = Quaternion.LookRotation(lookDir);
                    _force             = Acceleration * 0.6f;        //3f;
                }

                _rigidbody.AddForce(transform.forward * _force);
            }



            Vector3 driftVelocity = _rigidbody.velocity - Vector3.Dot(_rigidbody.velocity, transform.forward) * transform.forward;
            _rigidbody.AddForce(-1 * driftVelocity.normalized * driftVelocity.magnitude * TurnRate);
        }

        //keep under max speed
        if (_rigidbody.velocity.magnitude > MaxSpeed)
        {
            _rigidbody.AddForce(-1 * _rigidbody.velocity * 1);
        }

        if (_stage == MissileStage.Launched)
        {
            _rigidbody.AddForce(-1 * _rigidbody.velocity * 2.5f);
        }


        _age += Time.fixedDeltaTime;

        if (_age > TTL)
        {
            Explode();
        }
    }
Ejemplo n.º 3
0
 public void Fire(ShipBase attacker, Vector3 initialVelocity)
 {
     _stage              = MissileStage.Launched;
     _initialVelocity    = initialVelocity;
     _rigidbody.velocity = _initialVelocity;
 }