123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- 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<LineRenderer>();
- BulletSettings bulletSettings = GetComponent<BulletSettings>();
- 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];
- }
- }
|