private void StartMove()
    {
        m_MoveDuration = 0;
        m_MoveElapsed  = 0;
        m_IsMoving     = true;

        Vector3 rayDirRevert = m_BulletInfo.MoveDir * (-1);
        Vector3 impactScrPos = m_BulletInfo.ImpactSrcPos + rayDirRevert * m_BulletInfo.MoveImpactRadius;
        Ray     ray          = new Ray(impactScrPos, m_BulletInfo.MoveDir);

        RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, m_BulletInfo.MoveImpactRadius,
                                                            m_BulletInfo.MoveDistanceMax);
        Script_Util.DrawPhysicsSphereCastLine(ray, m_BulletInfo.MoveDistanceMax, m_BulletInfo.MoveImpactRadius, Color.red, 10.0f);
        if (targetHitInfos != null && targetHitInfos.Length > 0)
        {
            Script_Util.SortRaycastHit(ref targetHitInfos);
            m_IsHit        = true;
            m_MoveHitInfo  = targetHitInfos[0];
            m_MoveDuration = m_MoveHitInfo.distance / m_BulletInfo.MoveSpeed;
            m_HitPos       = m_MoveHitInfo.point;
        }
        else
        {
            m_IsHit        = false;
            m_MoveDuration = m_BulletInfo.MoveDistanceMax / m_BulletInfo.MoveSpeed;
            m_HitPos       = Script_Util.CaculateRelativePos(m_BulletInfo.MoveStartPos,
                                                             m_BulletInfo.MoveDir, m_BulletInfo.MoveDistanceMax);
        }
    }
示例#2
0
    public static void ProcessVerticalImpact(GameObject attacker, GameObject sender,
                                             SkillImpactInfos impacts, float verticalHeight = 10.0f, float verticalHeightStart = 0.0f,
                                             float SectorDegree = 360.0f, int hitCount = 1)
    {
        bool isTargeted = false;
        // Find Targets
        Ray ray = new Ray(
            sender.transform.position + new Vector3(0, verticalHeightStart - impacts.ImpactRadius, 0),
            Vector3.up);

        RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, impacts.ImpactRadius,
                                                            verticalHeight, (int)SceneLayerType.Character);
        Script_Util.DrawPhysicsSphereCastLine(ray, verticalHeight, impacts.ImpactRadius, Color.red, 10.0f);
        int index = 0;

        while (index < targetHitInfos.Length)
        {
            if (targetHitInfos[index].collider == null || targetHitInfos[index].collider.gameObject == null)
            {
                index++;
                continue;
            }

            GameObject target = targetHitInfos[index].collider.gameObject;
            if (target != null)
            {
                Vector3 targetDir = target.transform.position - sender.transform.position;
                targetDir.y = 0;
                Vector3 senderDir = sender.transform.rotation * Vector3.forward;
                if (Mathf.Abs(Vector3.Angle(targetDir, senderDir)) > SectorDegree)
                {
                    index++;
                    continue;
                }

                ImpactInfo curImpact = ExtractBestImpactInfo(target, impacts);
                if (curImpact != null)
                {
                    Vector3 faceDir = target.transform.position - sender.transform.position;
                    faceDir.y = 0;
                    ImpactInfo m_ImpactInfo = curImpact.Clone() as ImpactInfo;
                    m_ImpactInfo.m_Velocity = Quaternion.LookRotation(faceDir)
                                              * m_ImpactInfo.m_Velocity;
                    m_ImpactInfo.Attacker = sender;
                    ImpactSystem.Instance.SendImpact(attacker, target, m_ImpactInfo, hitCount);
                    TriggerImpl.RecordTarget(attacker, target);
                    isTargeted = true;
                }
            }
            index++;
        }
        ProcessImpactLock(attacker, impacts, isTargeted);
    }
    private void ProcessImpact()
    {
        if (m_TargetHitInfos != null)
        {
            m_TargetHitInfos.Clear();
        }

        Vector3 rayDirRevert = m_BulletInfo.MoveDir * (-1);
        Vector3 impactScrPos = m_BulletInfo.ImpactSrcPos + rayDirRevert * m_BulletInfo.ImpactInfos.ImpactRadius;
        Ray     ray          = new Ray(impactScrPos, m_BulletInfo.MoveDir);
        float   distance     = (m_HitPos - m_BulletInfo.ImpactSrcPos).magnitude;

        RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, m_BulletInfo.ImpactInfos.ImpactRadius,
                                                            distance, (int)SceneLayerType.Character);
        Script_Util.DrawPhysicsSphereCastLine(ray, distance, m_BulletInfo.ImpactInfos.ImpactRadius, Color.red, 10.0f);
        if (targetHitInfos != null && targetHitInfos.Length > 0)
        {
            m_TargetHitInfos = new List <RaycastHit>(targetHitInfos);
            m_TargetHitInfos = CheckTarget(m_TargetHitInfos, m_BulletInfo.ImpactInfos);
            foreach (RaycastHit hitInfo in m_TargetHitInfos)
            {
                GameObject target = hitInfo.transform.gameObject;
                if (target != null)
                {
                    ImpactInfo tImpactInfo = TriggerImpl.ExtractBestImpactInfo(target, m_BulletInfo.ImpactInfos);
                    if (tImpactInfo != null)
                    {
                        tImpactInfo = tImpactInfo.Clone() as ImpactInfo;
                        Script_Util.AdjustImpactEffectDataPos(target, GetAttacker(), tImpactInfo, hitInfo.point, m_BulletInfo.MoveDir);
                        Vector3 faceDir = m_BulletInfo.MoveDir;
                        faceDir.y = 0;
                        tImpactInfo.m_Velocity = Quaternion.LookRotation(faceDir) * tImpactInfo.m_Velocity;
                        tImpactInfo.Attacker   = GetAttacker();
                        ImpactSystem.Instance.SendImpact(GetAttacker(), target, tImpactInfo);
                        TriggerImpl.RecordTarget(GetAttacker(), target);
                    }
                }
            }
        }
    }