123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- using UnityEngine;
- using System.Collections;
- public class Bullet : MapObject
- {
- public int id;
- public string path;
- public float damage;
- public float speed = 0;
- public float speedAcc = 40f;
- public float maxSpeed = 20f;
- protected float startTime;
- protected ITarget target;
- protected Power power;
- protected Vector3 lastTargetPosition;
- public Transform shotTrans;
- public virtual void Init(Map map, Vector3 position, ITarget target, Power power)
- {
- this.map = map;
- this.target = target;
- this.power = power;
- this.transform.position = position;
- InitRotation();
- }
- public virtual void Reset()
- {
- startTime = GameTime.time;
- BulletSettings settings = GetComponent<BulletSettings>();
- if(settings != null)
- {
- speed = settings.speed;
- speedAcc = settings.speedAcc;
- maxSpeed = settings.maxSpeed;
- }
- }
- public IPowerOwner GetOwner()
- {
- return power.GetOwner();
- }
- public Power GetPower()
- {
- return power;
- }
- public virtual void InitRotation()
- {
- if(target == null)
- return;
- Vector3 targetPos = target.position;
- float theta = NumberUtil.getRadianByATan(this.transform.position.x, this.transform.position.z, targetPos.x, targetPos.z);
-
- //updatae rotation
- float rotateAngle = -NumberUtil.radianToAngle(theta);
- Vector3 eulerAngles = transform.eulerAngles;
- eulerAngles.y = rotateAngle;
- transform.eulerAngles = eulerAngles;
- }
- // Update is called once per frame
- public virtual void Update ()
- {
- if(target != null && !target.IsDead())
- {
- lastTargetPosition = target.position;
- }
- if(lastTargetPosition == Vector3.zero)
- Remove();
- float theta = NumberUtil.getRadianByATan(lastTargetPosition.x, lastTargetPosition.z, this.transform.position.x, this.transform.position.z);
- //updatae rotation
- float rotateAngle = -NumberUtil.radianToAngle(theta);
- Vector3 eulerAngles = transform.eulerAngles;
- eulerAngles.y = rotateAngle;
- transform.eulerAngles = eulerAngles;
- //update position
- speed += speedAcc*GameTime.deltaTime;
- if(speed > maxSpeed)
- {
- speed = maxSpeed;
- }
- float movDistance = Mathf.Abs(speed)*GameTime.deltaTime;
- float distance = 0;
- distance = NumberUtil.distanceVector2(new Vector2(transform.position.x, transform.position.z), new Vector2(lastTargetPosition.x, lastTargetPosition.z));
- if(distance < movDistance)
- {
- MakeDamage();
- }
- else
- {
- float movX = movDistance*Mathf.Cos(theta);
- float movY = movDistance*Mathf.Sin(theta);
- Vector3 position = transform.position;
- position.x += movX;
- position.z += movY;
- transform.position = position;
- }
- }
- protected virtual void MakeDamage()
- {
- DoDamage(target);
- Remove();
- }
- protected virtual void DoDamage(ITarget target)
- {
- if(target == null || target.IsDead())
- {
- return;
- }
- if(power.GetPowerEffect() == Power.PowerEffect.Damage)
- target.MakeDamage(this);
- else
- target.MakeHeal(this);
- if(!StringUtil.Empty(power.GetHitEffect()))
- {
- GameObject hitEffect = EffectUtil.CreateEffect(power.GetHitEffect());
- if(hitEffect != null)
- {
- hitEffect.SetActive(false);
- HitEffectSettings settings = hitEffect.GetComponent<HitEffectSettings>();
- if(settings == null)
- {
- Vector3 heartPos = target.heartPos;
- heartPos.x += Random.Range(-0.5f, 0.5f);
- heartPos.z += Random.Range(-0.5f, 0.5f);
- hitEffect.transform.position = target.heartPos;
- hitEffect.SetActive(true);
- }
- else
- {
- if(settings.isLocal)
- {
- GameObject targetObj = (target as Component).gameObject;
- hitEffect.transform.SetParent(targetObj.transform);
- hitEffect.transform.localPosition = settings.originPos;
- hitEffect.transform.eulerAngles = Vector3.zero;
- }
- hitEffect.SetActive(true);
- }
- }
- power.PlayHitSound();
- }
- if(power.GetBuff() > 0)
- BuffManager.GetInstance().AddBuff(power.GetBuff(), target as BattleObject, power.GetOwner() as BattleObject);
- }
- public override void Remove ()
- {
- BulletFactory.Recycle(path, this.gameObject);
- }
- public override string ToString ()
- {
- return string.Format ("[Bullet] "+power.ToString());
- }
- }
|