void CheckInTrigger(Vector3 emitter) { Collider[] colls = Physics.OverlapSphere(transform.position, 0.1f, GameConfig.ProjectileDamageLayer); for (int i = 0; i < colls.Length; ++i) { Collider hitCol = colls[i]; if (hitCol.transform == null) { continue; } if (hitCol.transform.IsChildOf(transform)) { continue; } if (m_Caster != null && hitCol.transform.IsChildOf(m_Caster)) { continue; } if (hitCol.gameObject.tag == "EnergyShield") { EnergySheildHandler shield = hitCol.GetComponent <EnergySheildHandler>(); if (shield != null) { shield.Impact(emitter); } continue; } PEDefenceTrigger defencetrigger = hitCol.transform.GetComponent <PEDefenceTrigger>(); if (null != defencetrigger) { PECapsuleHitResult hitResult; if (!defencetrigger.GetClosest(emitter, (TriggerBounds.size / 2f).magnitude, out hitResult)) { continue; } Hit(hitResult.hitPos, -hitResult.hitDir, hitResult.hitTrans); if (!m_Trigger) { m_Valid = false; } } else if (!hitCol.isTrigger) { Hit(emitter, Vector3.Normalize(emitter - hitCol.transform.position), hitCol.transform); if (!m_Trigger) { m_Valid = false; } } return; } }
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); }
public override Vector3 Track(float deltaTime) { if (emit == null) { return(Vector3.zero); } RaycastHit[] hitsInfos = Physics.RaycastAll(emit.position, emit.forward, range, GameConfig.ProjectileDamageLayer); foreach (RaycastHit hitInfo in hitsInfos) { Collider collider = hitInfo.collider; if (collider == null || collider.tag == "WorldCollider" || collider.transform.IsChildOf(transform) || m_Emitter != null && collider.transform.IsChildOf(m_Emitter)) { continue; } PEDefenceTrigger defencetrigger = collider.GetComponent <PEDefenceTrigger>(); PECapsuleHitResult result; if (null == defencetrigger && collider.isTrigger) { continue; } if (null == defencetrigger || !defencetrigger.RayCast(new Ray(emit.position, emit.forward), range, out result) || result.distance < hitInfo.distance) { m_HitPositions.Add(hitInfo.point); } else { m_HitPositions.Add(result.hitPos); } } Vector3 finalPos = emit.position + emit.forward * range; float closetDistance = 2 * range * 2 * range; for (int i = 0; i < m_HitPositions.Count; ++i) { float sqrDistance = (m_HitPositions[i] - emit.position).sqrMagnitude; if (sqrDistance < closetDistance) { closetDistance = sqrDistance; finalPos = m_HitPositions[i]; } } m_HitPositions.Clear(); return(finalPos - transform.position); }
void CheckHit() { if (null != m_Beat && Input.GetMouseButtonDown(0)) { Ray ray = cam.ScreenPointToRay(Input.mousePosition); // Raycast to find a ragdoll collider RaycastHit hit = new RaycastHit(); if (Physics.Raycast(ray, out hit, 100f, m_CheckLayer.value)) { PEDefenceTrigger defenceTrigger = hit.collider.GetComponent <PEDefenceTrigger>(); PECapsuleHitResult result; if (defenceTrigger.RayCast(ray, 1000f, out result)) { m_Beat.Beat(GetComponentInParent <SkAliveEntity>(), result.hitTrans, ray.direction, m_HitPower); } } } }
public virtual void SetData(Transform caster, Transform emitter, Transform target, Vector3 targetPosition, int index = 0) { m_Caster = caster; m_Emitter = emitter; m_Target = target; m_TargetPosition = targetPosition; m_Index = index; if (m_Target != null) { m_TargetView = m_Target.GetComponentInParent <BiologyViewCmpt>(); m_TargetTrans = m_Target.GetComponentInParent <PeTrans>(); if (null != m_TargetView) { m_DefenceTrigger = m_TargetView.GetComponentInChildren <PEDefenceTrigger>(); } } if (m_InitRot) { transform.rotation = Quaternion.identity; } isActive = true; }
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); }