示例#1
0
    void Update()
    {
        _age += Time.deltaTime;
        if (_age > MissileLifeTime)
        {
            Destroy(gameObject);
        }

        var collider = GetComponent <CapsuleCollider>();

        if (_age > .5f && !collider.enabled)
        {
            collider.enabled = true;
        }

        var projectileSpeed = (5 / ((float)Math.Round(Time.time - _age, 2)) + 50);

        switch (_missleType)
        {
        case MissleType.Homing:
        {
            if (_age > .75f && _target != null)
            {
                var direction = _target.transform.position - transform.position;
                var rotation  = Quaternion.LookRotation(direction);
                transform.rotation = Quaternion.Slerp(transform.rotation, rotation, RotationRate);
            }
            break;
        }

        case MissleType.Smart:
        {
            if (_age > .75f && _target != null)
            {
                var targetRigidBody = _target.GetComponent <Rigidbody>();

                var targetAimPoint = PredictiveAiming.FirstOrderIntercept(transform.position, Vector3.zero, projectileSpeed, _target.transform.position, targetRigidBody.velocity);

                var direction = targetAimPoint - transform.position;
                var rotation  = Quaternion.LookRotation(direction);
                transform.rotation = Quaternion.Slerp(transform.rotation, rotation, RotationRate);
            }
            break;
        }
        }
    }
示例#2
0
    void Update()
    {
        if (tag == "Untagged")
        {
            var players = new List <GameObject>();
            _factions.ForEach(x => players.AddRange(GameObject.FindGameObjectsWithTag(x)));
            var collector = players.FirstOrDefault(x => Vector3.Distance(x.transform.position, transform.position) < 5);
            if (collector != null)
            {
                tag = collector.tag;
                GetComponent <Renderer>().material.color = Faction.Colour(tag);
                AquireTarget();
            }
        }
        else if (Target != null)
        {
            // F = m * (s/t), where "m" is the mass of the object, "s" is the desired speed and t = Time.fixedDeltaTime.
            var   shotMass        = 1f;
            float projectileSpeed = (ShotForce / shotMass) * Time.fixedDeltaTime;

            var interceptPoint = PredictiveAiming.FirstOrderIntercept(transform.position, Vector3.zero, projectileSpeed, Target.transform.position, _targetRigidBody.velocity);
            var direction      = interceptPoint - transform.position;
            var rotation       = Quaternion.LookRotation(direction);
            transform.rotation = Quaternion.Lerp(transform.rotation, rotation, RotationRate);

            var distanceToTarget = Vector3.Distance(Target.transform.position, transform.position);

            if (distanceToTarget < 15)
            {
                FireCannon();
            }
        }
        else
        {
            AquireTarget();
        }
    }