using UnityEngine; using System.Collections; public class ChainBullet : Bullet { public float delayEffect = 0.2f; public float delayRemove = 1f; private bool effected = false; public ITarget origin; private Vector3 lastOriginPosition; public Transform muzzleTrans; public Transform flareTrans; public bool AnimateUV = true; // UV Animation public float UVTime; public float Amplitude = 0.3f; public Texture[] beamFrames; float initialBeamOffset; float beamLength; public LineRenderer lineRenderer; void Awake() { muzzleTrans = transform.FindChild("Muzzle"); flareTrans = transform.FindChild("Flare"); lineRenderer = GetComponent(); BulletSettings bulletSettings = GetComponent(); if(bulletSettings != null) { beamFrames = bulletSettings.beamFrames; } Reset (); } public override void Reset () { base.Reset (); initialBeamOffset = Random.Range(0f, 5f); effected = false; } public override void InitRotation () { } override public void Update () { if(target != null && !target.IsDead()) { lastTargetPosition = target.heartPos; } if(origin != null && !origin.IsDead()) { if(shotTrans != null) lastOriginPosition = shotTrans.position; else lastOriginPosition = origin.heartPos; } if(lastTargetPosition == Vector3.zero || lastOriginPosition == Vector3.zero) Remove(); UpdateLineRenderer(); // float theta = NumberUtil.getRadianByATan(lastTargetPosition.x, lastTargetPosition.z, lastOriginPosition.x, lastOriginPosition.z); // float distance = NumberUtil.distanceVector2(new Vector2(lastTargetPosition.x, lastTargetPosition.z), new Vector2(lastOriginPosition.x, lastOriginPosition.z)); // // //updatae rotation // float rotateAngle = -NumberUtil.radianToAngle(theta); // Vector3 eulerAngles = transform.eulerAngles; // eulerAngles.y = rotateAngle; // transform.eulerAngles = eulerAngles; // // transform.localScale = new Vector3(distance, 1f, 1f); // // Vector3 position = new Vector3(); // position.x = (lastTargetPosition.x+lastOriginPosition.x)/2f; // position.y = 1f; // position.z = (lastTargetPosition.z+lastOriginPosition.z)/2f; // transform.position = position; float deltaTime = GameTime.time-startTime; if(!effected && deltaTime >= delayEffect) { DoDamage(target); effected = true; } else if(deltaTime >= delayRemove) { Remove(); } } private void UpdateLineRenderer() { transform.position = lastOriginPosition; muzzleTrans.position = lastOriginPosition; flareTrans.position = lastTargetPosition; lineRenderer.material.SetTextureOffset("_MainTex", new Vector2(GameTime.time * UVTime + initialBeamOffset, 0f)); // Process raycasting OnOscillate(); OnFrameStep(); } void OnOscillate() { lineRenderer.SetVertexCount(2); lineRenderer.SetPosition(0, new Vector3(0, 0, 0)); float x = lastTargetPosition.x - lastOriginPosition.x; float z = lastTargetPosition.z - lastOriginPosition.z; lineRenderer.SetPosition(1, new Vector3(x, 0, z)); } float GetRandomNoise() { return Random.Range(-Amplitude, Amplitude); } void OnFrameStep() { if(beamFrames == null) return; int frameNo = Random.Range(0, beamFrames.Length); lineRenderer.material.mainTexture = beamFrames[frameNo]; } }