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); }
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); }
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); }
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(); }
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; }