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); } } }
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) { } } }
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); } }
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); } } } } }
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); }