Beispiel #1
0
    public void OnDestroy()
    {
        Collider[] colliders = Physics.OverlapSphere(transform.position, mDamageRadius);
        Serpent    serpent   = null;

        for (int i = 0, n = colliders.Length; i < n; ++i)
        {
            Collider c = colliders[i];
            if (c.attachedRigidbody != null)
            {
                c.attachedRigidbody.AddExplosionForce(mExplosionForce * c.attachedRigidbody.mass, transform.position, mDamageRadius);
                Debug.DrawLine(transform.position, c.transform.position, Color.red, 60.0f);
            }
            if (serpent == null)
            {
                SerpentSegment segment = c.GetComponentInParent <SerpentSegment>();
                if (segment != null)
                {
                    serpent = segment.mSerpent;
                }
            }
        }

        if (serpent != null)
        {
            serpent.TakeDamage(mDamagePower);
        }

        Quaternion rot       = Quaternion.LookRotation(transform.position.normalized, Vector3.forward);
        GameObject explosion = Instantiate(mExplosionPrefab, transform.position, rot) as GameObject;

        explosion.transform.localScale = Vector3.one * mDamageRadius;
        Destroy(explosion, 2.0f);
    }
Beispiel #2
0
    protected SerpentSegment CreateSegment(GameObject prefab, GameObject attachTarget)
    {
        GameObject     segmentObj = Instantiate(prefab, attachTarget.transform.position, attachTarget.transform.rotation) as GameObject;
        SerpentSegment segment    = segmentObj.GetComponent <SerpentSegment>();

        segment.mSerpent = this;
        segment.AttachTo(attachTarget);
        return(segment);
    }
Beispiel #3
0
    public void AddSegment(GameObject prefab)
    {
        LinkedListNode <SerpentSegment> tailNode = mSegments.Last;
        LinkedListNode <SerpentSegment> prevNode = tailNode.Previous;

        SerpentSegment segment = CreateSegment(prefab, prevNode.Value.gameObject);

        segment.mModel.transform.localScale = new Vector3(0.85f, 0.85f, 0.85f);
        tailNode.Value.AttachTo(segment.gameObject);

        mSegments.AddBefore(tailNode, segment);
    }
Beispiel #4
0
    public void Update()
    {
        if (mReentryInputBlockerTimer > 0)
        {
            mReentryInputBlockerTimer -= Time.deltaTime;
        }

        if (!IsAboveWater())
        {
            if (mReentryInputBlockerTimer <= 0)
            {
                int        numSegmentsInRange = 0;
                Vector3    segmentsCenter     = Vector3.zero;
                Collider[] colliders          = Physics.OverlapSphere(transform.position, mDetectionRadius, kSerpentMask);
                for (int i = 0, n = colliders.Length; i < n; ++i)
                {
                    Collider       c       = colliders[i];
                    SerpentSegment segment = c.GetComponentInParent <SerpentSegment>();
                    if (segment != null)
                    {
                        segmentsCenter += segment.transform.position;
                        numSegmentsInRange++;
                    }
                }

                if (numSegmentsInRange > 0)
                {
                    segmentsCenter  /= numSegmentsInRange;
                    segmentsCenter.z = 0;
                    Vector3 desiredVel = transform.position - segmentsCenter;
                    desiredVel.Normalize();
                    //mRigidbody.AddForce(dirAwayFromSegments * mFleeSpeed, ForceMode.VelocityChange);
                    Vector3 vel = mRigidbody.velocity;
                    Vector3.SmoothDamp(vel, desiredVel * mFleeSpeed, ref vel, 1.0f, mFleeSpeed, Time.deltaTime);

                    mRigidbody.velocity = vel;
                }
            }
        }
        else
        {
            mReentryInputBlockerTimer = mReentryInputBlockerTime;
        }

        UpdateLooking();
    }
Beispiel #5
0
    public override void Awake()
    {
        base.Awake();
        if (mAnimator == null)
        {
            mAnimator = GetComponentInChildren <Animator>();
        }
        mSerpent = this;

        mDesiredPos = transform.position;

        GameObject attachTarget = gameObject;

        for (int i = 0; i < mNumInitialSegments; ++i)
        {
            SerpentSegment segment = CreateSegment((i != mNumInitialSegments - 1)?mSegmentPrefab:mTailPrefab, attachTarget);
            attachTarget = segment.gameObject;
            mSegments.AddLast(new LinkedListNode <SerpentSegment>(segment));
        }

        mHealth = mNumInitialSegments;
    }