Пример #1
0
        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;
            }
        }
Пример #2
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);
        }
Пример #3
0
    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);
    }
Пример #4
0
    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);
                }
            }
        }
    }
Пример #5
0
    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;
    }
Пример #6
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);
        }