예제 #1
0
        protected virtual void Hit(Vector3 pos, Vector3 normal, Transform hitTrans)
        {
            PlayEffectHit(pos, normal);

            if (!m_Trigger)
            {
                Delete();
            }

            if (hitTrans != null)
            {
                SkEntity skEntity = hitTrans.GetComponentInParent <SkEntity>();
                if (null == skEntity)
                {
                    return;
                }
                PeEntity entity = skEntity.GetComponent <PeEntity>();
                if (null != skEntity && (null == entity || entity.canInjured))
                {
                    PECapsuleHitResult hitResult = new PECapsuleHitResult();
                    hitResult.selfTrans   = transform;
                    hitResult.hitPos      = pos;
                    hitResult.hitDir      = -normal;
                    hitResult.hitTrans    = hitTrans;
                    hitResult.damageScale = 1f;
                    CastSkill(skEntity, hitResult);
                }
            }
        }
예제 #2
0
        protected virtual void Hit(PECapsuleHitResult hitResult, SkEntity skEntity = null)
        {
            PlayEffectHit(hitResult.hitPos, -hitResult.hitDir);

            if (!m_Trigger)
            {
                Delete();
            }

            if (hitResult.hitTrans != null)
            {
                if (null == skEntity)
                {
                    skEntity = hitResult.hitTrans.GetComponentInParent <SkEntity>();
                }
                if (null == skEntity)
                {
                    return;
                }
                PeEntity entity = skEntity.GetComponent <PeEntity>();
                if (null == entity || entity.canInjured)
                {
                    CastSkill(skEntity, hitResult);
                }
            }
        }
예제 #3
0
        PECapsuleHitResult GetHitResult(Transform self, Collider other)
        {
            PECapsuleHitResult hitResult      = null;
            PEDefenceTrigger   defencetrigger = other.transform.GetComponent <PEDefenceTrigger>();

            if (null == m_SelfCollider)
            {
                m_SelfCollider = GetComponentInChildren <Collider>();
            }

            if (null != defencetrigger && (null == m_SelfCollider || !(m_SelfCollider is MeshCollider)))
            {
                float size = (TriggerBounds.size / 2f).magnitude;
                if (size <= Mathf.Epsilon)
                {
                    size = 0.1f;
                }
                if (!defencetrigger.active || !defencetrigger.GetClosest(self.position, (TriggerBounds.size / 2f).magnitude, out hitResult))
                {
                    return(null);
                }
            }
            else
            {
                hitResult           = new PECapsuleHitResult();
                hitResult.hitTrans  = other.transform;
                hitResult.selfTrans = self;
                hitResult.hitPos    = other.ClosestPointOnBounds(self.position);

                Vector3 dir = hitResult.hitPos - self.position;
                if (dir == Vector3.zero)
                {
                    dir = other.transform.position - self.position;
                }
                hitResult.distance = dir.magnitude;
                hitResult.hitDir   = dir.normalized;
                SkEntity skEntity = other.transform.GetComponentInParent <SkEntity>();
                if (null != skEntity)
                {
                    if (skEntity is VFVoxelTerrain)
                    {
                        hitResult.hitDefenceType = DefenceType.Carrier;
                    }
                    else if (skEntity is WhiteCat.CreationSkEntity)
                    {
                        hitResult.hitDefenceType = DefenceType.Carrier;
                    }
                }
                hitResult.damageScale = 1f;
            }

            hitResult.selfAttackForm = AttackForm.Bullet;
            return(hitResult);
        }
예제 #4
0
        void OnColliderEnter(Collider self, Collider other)
        {
            if (0 == ((1 << other.gameObject.layer) & GameConfig.ProjectileDamageLayer))
            {
                return;
            }
            if ((m_Caster == null || !other.transform.IsChildOf(m_Caster)) &&
                !other.transform.IsChildOf(transform) &&
                self.transform.IsChildOf(transform) &&
                0 != ((1 << other.gameObject.layer) & GameConfig.ProjectileDamageLayer))
            {
                PECapsuleHitResult hitResult = GetHitResult(self.transform, other);
                if (null != hitResult)
                {
                    CollisionCheck(hitResult);
                }
            }

            OnTriggerEnter(other);
        }
예제 #5
0
        protected virtual void CastSkill(SkEntity skEntity, PECapsuleHitResult hitResult)
        {
            if (PETools.PEUtil.IsVoxelOrBlock45(skEntity))
            {
                if (m_SkillTerrainID > 0)
                {
                    SkInst skillinst = StartSkill(skEntity, m_SkillTerrainID, null, false);
                    if (skillinst != null)
                    {
                        skillinst._colInfo = hitResult;
                        skillinst.Start();
                    }
                }
            }
            else
            {
                if (m_SkillID > 0)
                {
                    SkInst skillinst = StartSkill(skEntity, m_SkillID, null, false);
                    if (skillinst != null)
                    {
                        skillinst._colInfo = hitResult;
                        skillinst.Start();
                    }
                }
            }

            if (null != onCastSkill)
            {
                onCastSkill(skEntity);
            }

            if (null != skEntity && null != onHitSkEntity)
            {
                onHitSkEntity(skEntity);
            }
        }
예제 #6
0
        public void OnTriggerEnter(Collider other)
        {
            if (m_DeletByHitLayer && 0 != (m_DeletLayer.value & (1 << other.gameObject.layer)))
            {
                Delete();
            }

            if (!m_Valid)
            {
                return;
            }

            if (0 == ((1 << other.gameObject.layer) & GameConfig.ProjectileDamageLayer))
            {
                return;
            }

            if (other.gameObject.GetComponentInParent <SkProjectile>() != null)
            {
                return;
            }

            if (other.transform.IsChildOf(transform))
            {
                return;
            }

            if (m_Caster != null && other.transform.IsChildOf(m_Caster))
            {
                return;
            }

            if (!m_Colliders.Contains(other))
            {
                m_Colliders.Add(other);
            }

            SkEntity entity = other.GetComponentInParent <SkEntity>();

            if (entity != null)
            {
                if (!m_Explode && !m_DamageEntities.Contains(entity))
                {
                    PECapsuleHitResult hitResult = GetHitResult(transform, other);
                    if (null != hitResult)
                    {
                        if (other.gameObject.tag == "EnergyShield")
                        {
                            EnergySheildHandler shield = other.GetComponent <EnergySheildHandler>();
                            if (shield != null)
                            {
                                shield.Impact(hitResult.hitPos);
                            }
                            return;
                        }

                        if (!m_DamageEntities.Contains(entity))
                        {
                            Hit(hitResult);
//							CastSkill(entity, hitResult);
                            m_DamageEntities.Add(entity);
                        }
                    }
                }

                if (!m_Entities.Contains(entity))
                {
                    m_Entities.Add(entity);
                }
            }
        }
예제 #7
0
        bool GetRaycastInfo(Vector3 position, Vector3 velcity, out RaycastHit hitInfo, out Transform hitTrans, out PECapsuleHitResult hitResult, out bool useHitReslut, int layer)
        {
            hitResult    = null;
            useHitReslut = false;
            hitInfo      = new RaycastHit();
            hitTrans     = null;
            if (velcity.sqrMagnitude > 0.05f * 0.05f)
            {
                Ray          rayStart = new Ray(position, velcity);
                RaycastHit[] hitInfos = Physics.RaycastAll(rayStart, velcity.magnitude, layer);
                hitInfos = PETools.PEUtil.SortHitInfo(hitInfos, false);
                RaycastHit hit;
                for (int i = 0; i < hitInfos.Length; ++i)
                {
                    hit = hitInfos[i];
                    if (hit.transform == null)
                    {
                        continue;
                    }

                    if (hit.transform.IsChildOf(transform))
                    {
                        continue;
                    }

                    if (m_Caster != null && hit.transform.IsChildOf(m_Caster))
                    {
                        continue;
                    }

                    if (hit.collider.gameObject.tag == "EnergyShield")
                    {
                        EnergySheildHandler shield = hit.collider.GetComponent <EnergySheildHandler>();
                        if (shield != null)
                        {
                            shield.Impact(hit.point);
                        }
                        continue;
                    }

                    hitInfo  = hit;
                    hitTrans = hit.transform;

                    PEDefenceTrigger defencetrigger = hit.transform.GetComponent <PEDefenceTrigger>();
                    if (null != defencetrigger)
                    {
                        if (!defencetrigger.RayCast(rayStart, 100f, out hitResult))
                        {
                            continue;
                        }
                        hitInfo.point = hitResult.hitPos;
                        hitTrans      = hitResult.hitTrans;
                        useHitReslut  = true;
                    }
                    else if (hit.collider.isTrigger)
                    {
                        return(false);
                    }

                    return(true);
                }
            }

            return(false);
        }
예제 #8
0
 protected override void Hit(PECapsuleHitResult hitResult, SkEntity skEntity = null)
 {
     EmitProjectile(hitResult.hitTrans);
     base.Hit(hitResult, skEntity);
 }