| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- using Base.Common;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public enum BulletType
- {
- Single = 0, //单体目标,触发后即销毁
- Penetrate = 1, //穿透,可击中多个目标
- Bomb = 2, //击中目标后爆炸
- MagicLock = 3, //锁定目标,只会击中目标
- }
- public class Bullet : MonoBehaviour
- {
- public Character owner;
- public Rigidbody rb;
- public List<BeHitTrigger> trigedObjs;
- public int damage;
- public float force;
- public bool changeHurt;
- public float repelValue;
- public BulletType bulletType;
- public bool isGetTarget = false;
- public float speed;
- public float maxFlyTime = 2f;
- public float flyTime;
- public bool isTrack;
- public Character trackTarget;
- [Header("回旋镖")]
- public bool isBack; //回旋镖,会回来
- public float stayTime; //在极点处停留时长
- private bool isStay = false;
- //private Vector3 curDir;
- private bool hasBack = false; //已经回来了
- [Header("传送门")]
- public bool canTransmit; //子弹是否能被传送门传送
- public bool haveTransmit; //刚传送过
- [HideInInspector]
- public float transmitTime; //传送CD
- public PortalsController portalsController;
-
- private bool isInVain; //击中光球,攻击无效
- private void Awake()
- {
- rb = GetComponent<Rigidbody>();
- }
- private void Update()
- {
- if (haveTransmit)
- {
- transmitTime -= Time.deltaTime;
- if (transmitTime <= 0)
- {
- haveTransmit = false;
- portalsController.rbs.Remove(rb);
- }
- }
- if(bulletType == BulletType.MagicLock)
- {
- Vector3 dis1 = trackTarget.beSearchTrigger.transform.position;
- Vector3 dis2 = transform.position;
- dis2.z = dis1.z;
- if (Vector3.Distance(dis1,dis2) < 0.1)
- {
- trackTarget.BeHit(damage, Vector3.zero, false, 0);
- if (trackTarget.debugAttackFrom)
- {
- trackTarget.DebugAttackFrom(owner.name, damage);
- }
- gameObject.SetActive(false);
- }
- }
- }
- private void FixedUpdate()
- {
- if (bulletType != BulletType.MagicLock)
- {
- flyTime += Time.deltaTime;
- }
-
- if(flyTime >= maxFlyTime)
- {
- isGetTarget = true;
- gameObject.SetActive(false);
- return;
- }
- //回旋镖
- //if (!isStay && flyTime >= maxFlyTime)
- //{
- // if (!isBack)
- // {
- // isGetTarget = true;
- // gameObject.SetActive(false);
- // return;
- // }
- // else
- // {
- // isStay = true;
- // flyTime = 0;
- // rb.velocity = Vector3.zero;
- // }
- //}
- //if(isStay && flyTime >= stayTime)
- //{
- // isStay = false;
- // hasBack = true;
- // trackTarget = owner;
- //}
- //if (hasBack)
- //{
- // if (owner.gameObject.activeSelf == false)
- // {
- // isStay = true;
- // flyTime = 0;
- // rb.velocity = Vector3.zero;
- // }
- //}
- if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
- {
- Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
- tarDir.z = 0;
- transform.right = Vector3.Lerp(transform.right, -tarDir, 0.2f);
- rb.velocity = Vector3.Lerp(rb.velocity, speed * tarDir, 0.2f);
- }
- }
- public void BeShoot(Character own, Vector3 shootPos, Vector3 dir, int dmg, float fc, bool hurt, float repel, bool track = false, Character target = null)
- {
- transform.position = shootPos;
- transform.right = -dir;
- gameObject.SetActive(true);
- isGetTarget = false;
- owner = own;
- damage = dmg;
- force = fc;
- changeHurt = hurt;
- repelValue = repel;
- rb.velocity = dir * speed;
- isTrack = track;
- trackTarget = target;
- flyTime = 0;
- //curDir = dir;
- }
- private void OnTriggerEnter(Collider other)
- {
- if (isGetTarget || isInVain)
- {
- return;
- }
- Photosphere photosphere = other.GetComponentInParent<Photosphere>();
- if (photosphere && Util.CheckCanHit(owner.tag, "Player"))
- {
- isInVain = true;
- photosphere.Reflex(owner.beHitTrigger, damage);
- gameObject.SetActive(false);
- return;
- }
- //回旋镖
- //if (other.GetComponentInParent<Character>() == owner)
- //{
- // if (hasBack)
- // {
- // isGetTarget = true;
- // gameObject.SetActive(false);
- // return;
- // }
- //}
- BeHitTrigger hitTrigger = other.GetComponent<BeHitTrigger>();
- if (hitTrigger != null)
- {
- bool triged = false;
- for (int i = 0; i < trigedObjs.Count; i++)
- {
- if (trigedObjs[i] == hitTrigger)
- {
- triged = true;
- break;
- }
- }
- if (!triged)
- {
- trigedObjs.Add(hitTrigger);
- if (Util.CheckCanHit(owner.tag, hitTrigger.owner.tag) && !hitTrigger.owner.isDie)
- {
- //计算护甲减免
- int curDamage = damage;
- int am = hitTrigger.owner.armor;
- if (am > 0)
- {
- int ap = owner.armorPiercing;
- int c = am - ap;
- if (c < 0)
- {
- c = 0;
- }
- curDamage = (int)(curDamage * (100f / (100 + c)) + 0.5f);
- }
- switch (bulletType)
- {
- case BulletType.Single:
- hitTrigger.BeHit(curDamage, force * (-transform.right), changeHurt, repelValue);
- if (hitTrigger.owner.debugAttackFrom)
- {
- hitTrigger.owner.DebugAttackFrom(owner.name, curDamage);
- }
- isGetTarget = true;
- gameObject.SetActive(false);
- break;
- case BulletType.Penetrate:
- hitTrigger.BeHit(curDamage, force * (-transform.right), changeHurt, repelValue);
- if (hitTrigger.owner.debugAttackFrom)
- {
- hitTrigger.owner.DebugAttackFrom(owner.name, curDamage);
- }
- break;
- case BulletType.Bomb:
- break;
- default:
- break;
- }
- }
- }
- }
- }
- private void OnEnable()
- {
- trigedObjs.Clear();
- }
- }
|