示例#1
0
    void DrawGizmos()
    {
        if (ShowHitDebug == false)
        {
            return;
        }

        if (mHitData != null && mOwner != null && mOwner.transform != null)
        {
            HitCheckBase hitCheck = mHitData.hitCheckData;
            Vector3      normal   = mOwner.transform.up;
            if (hitCheck.shapeType == EHitCheckShape.Fan)
            {
                Vector3 startVec = Quaternion.AngleAxis(-hitCheck.angle * 0.5f, normal) * mOwner.transform.forward;
                GizmosExtension.DrawFanShapeWithHeight(pos, normal, startVec, hitCheck.angle, hitCheck.radius, hitCheck.height);
            }
            else if (hitCheck.shapeType == EHitCheckShape.Cylinder || hitCheck.shapeType == EHitCheckShape.Capsule)
            {
                GizmosExtension.DrawCylinder(pos, normal, forwardDir, hitCheck.radius, hitCheck.height);
            }
            else if (hitCheck.shapeType == EHitCheckShape.LaserBeam)
            {
                GizmosExtension.DrawLaserBeam(pos, moveDirection, hitCheck.radius, hitCheck.height);
            }
        }
    }
示例#2
0
    void OnSceneUI(SceneView sceneView)
    {
        if (mHitData != null)
        {
            HitCheckBase hitCheck = mHitData.hitCheckData;
            Vector3      pos      = debugDummy.transform.TransformPoint(mHitData.startPosition) + hitCheck.posOffset;
            Vector3      normal   = debugDummy.transform.up;
            if (mHitData.moveSpeed > 0)
            {
                Vector3 startDir = debugDummy.transform.TransformDirection(mHitData.startDirection.normalized);
                Handles.ArrowCap(0, pos, Quaternion.LookRotation(startDir.normalized), 2f);
            }

            if (hitCheck.shapeType == EHitCheckShape.Fan)
            {
                Vector3 startVec = Quaternion.AngleAxis(-hitCheck.angle * 0.5f, normal) * debugDummy.transform.forward;
                GizmosExtension.DrawFanShapeWithHeight(pos, normal, startVec, hitCheck.angle, hitCheck.radius, hitCheck.height);
            }
            else if (hitCheck.shapeType == EHitCheckShape.Capsule || hitCheck.shapeType == EHitCheckShape.Cylinder)
            {
                GizmosExtension.DrawCylinder(pos, normal, debugDummy.transform.forward, hitCheck.radius, hitCheck.height);
            }
            else if (hitCheck.shapeType == EHitCheckShape.LaserBeam)
            {
            }
        }
    }
示例#3
0
    public void OnGUI()
    {
        if (mHitData != null)
        {
            mHitData.name           = AIFUIUtility.DrawTextField(mHitData.name, "名称", 100);
            mHitData.startTime      = EditorGUILayout.FloatField("开始触发时间", mHitData.startTime);
            mHitData.lastTime       = EditorGUILayout.FloatField("持续时间", mHitData.lastTime);
            mHitData.hitInterval    = EditorGUILayout.FloatField("攻击间隔", mHitData.hitInterval);
            mHitData.entityResName  = EditorGUILayout.TextField("显示实体资源", mHitData.entityResName);
            mHitData.startPosition  = EditorGUILayout.Vector3Field("初始位置", mHitData.startPosition);
            mHitData.startDirection = EditorGUILayout.Vector3Field("初始角度", mHitData.startDirection);
            mHitData.moveSpeed      = EditorGUILayout.FloatField("移动速度", mHitData.moveSpeed);
            mHitData.autoFaceTarget = EditorGUILayout.Toggle("自动朝向攻击目标", mHitData.autoFaceTarget);

            EditorGUILayout.Separator();
            GUILayout.Label("击中判定:");
            HitCheckBase hitCheck = mHitData.hitCheckData;
            hitCheck.shapeType = (EHitCheckShape)AIFUIUtility.DrawCustomEnum("击中框类型", hitCheck.shapeType, 100);
            hitCheck.posOffset = EditorGUILayout.Vector3Field("位置偏移", hitCheck.posOffset);
            hitCheck.radius    = EditorGUILayout.FloatField("半径", hitCheck.radius);
            if (hitCheck.shapeType == EHitCheckShape.LaserBeam)
            {
                hitCheck.height = EditorGUILayout.FloatField("激光束长度", hitCheck.height);
            }
            else
            {
                hitCheck.height = EditorGUILayout.FloatField("高度", hitCheck.height);
            }

            hitCheck.angle = EditorGUILayout.FloatField("攻击角度", hitCheck.angle);
        }
    }
示例#4
0
    void CheckHit()
    {
        if (mHitData.hitCheckData.shapeType == EHitCheckShape.LaserBeam)
        {
            HitCheckBase hitCheck = mHitData.hitCheckData;
            RaycastHit[] hits     = Physics.SphereCastAll(pos, mHitData.hitCheckData.radius, moveDirection, hitCheck.height);

            if (hits != null && hits.Length > 0)
            {
                for (int hitIndex = 0; hitIndex < hits.Length; hitIndex++)
                {
                    RaycastHit hit = hits[hitIndex];
                    for (int i = 0; i < AIMgr.instance.listAIs.Count; i++)
                    {
                        AIUnit ai = AIMgr.instance.listAIs[i];
                        if (ai.Controller == hit.collider)
                        {
                            //不在攻击频率内的,跳过
                            if (IsCannotHit(ai))
                            {
                                continue;
                            }
                            else
                            {
                                ai.OnGetHit();
                                RecordHit(ai);
                            }
                        }
                    }
                }
            }
        }
        else
        {
            for (int i = 0; i < AIMgr.instance.listAIs.Count; i++)
            {
                AIUnit ai = AIMgr.instance.listAIs[i];
                //不在攻击频率内的,跳过
                if (IsCannotHit(ai))
                {
                    continue;
                }
                else
                {
                    if (ai.CheckHit(mOwner, this)) //攻击成功,要记录当前攻击时间
                    {
                        RecordHit(ai);
                    }
                }
            }
        }
    }
示例#5
0
    public bool CheckHit(AIUnit attacker, AIHitUnit hitUnit)
    {
        if (AIMgr.IsAntiCamp(attacker, this) == false)
        {
            return(false);
        }
        bool          isHit    = false;
        AiClipHitData hitData  = hitUnit.mHitData;
        HitCheckBase  hitCheck = hitData.hitCheckData;

        switch (hitData.hitCheckData.shapeType)
        {
        case EHitCheckShape.Capsule:
        case EHitCheckShape.Cylinder:
        {
            if (MathTool.CheckCylinderHit(hitUnit.pos, hitData.hitCheckData.height, hitData.hitCheckData.radius, Controller))
            {
                isHit = true;
            }
            break;
        }

        case EHitCheckShape.Fan:
        {
            if (MathTool.CheckFanHit(hitUnit.pos, hitCheck.height, hitCheck.radius, hitCheck.angle, hitUnit.forwardDir, Controller))
            {
                isHit = true;
            }
            break;
        }
        }

        if (isHit)
        {
            OnGetHit();
        }

        return(isHit);
    }