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); } } }
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); } } }
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); }
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); }
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); } }
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); } } }
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); }
protected override void Hit(PECapsuleHitResult hitResult, SkEntity skEntity = null) { EmitProjectile(hitResult.hitTrans); base.Hit(hitResult, skEntity); }