V3.2.2 开始创建MultiLevel

使用Multi level使AI适应更复杂环境
基本Level创建完成
UI逻辑创建中
This commit is contained in:
2023-08-23 02:58:50 +09:00
parent 3381c83604
commit 5226f1dbbf
160 changed files with 43551 additions and 43731 deletions
+76 -27
View File
@@ -18,8 +18,8 @@ public class MouseInMap : MonoBehaviour
private Vector3 nowHitPosition = Vector3.zero;
private Vector3 nowHitPositionRelative = Vector3.zero;
private LayerMask groundMask;
private int randBlockNum;
private GameObject preSet;
private int blockNum;
private GameObject previewModel;
private TargetController targetCon;
private MousePreview mousePreviewCon;
private EnemyContainer enemyCon;
@@ -27,6 +27,11 @@ public class MouseInMap : MonoBehaviour
private MessageBoxController messageCon;
private TargetUIController targetUICon;
private const string ErrorMessageColor = "#800000ff";
private const string LevelTooHighError = "[Error]MouseInMap:ChangeBlockLevelTo:";
private const string AttackLevelErrorMsg = "Attack Level is too high!";
private const string GotoLevelErrorMsg = "Goto Level is too high!";
public enum MouseMode
{
Default,
@@ -36,6 +41,7 @@ public class MouseInMap : MonoBehaviour
}
public MouseMode mouseMode = MouseMode.Default;
public int blockLevel = 0;
private void Start()
{
@@ -66,15 +72,15 @@ public class MouseInMap : MonoBehaviour
{
// if agent or enemy is nearby, do not create new block
messageCon.PushMessage(new List<string> { "Agent or Enemy is too close!" },
new List<string> { "#800000ff" });
new List<string> { messageCon.errorColor });
}
else
{
// if agent or enemy is not nearby, create new block
sceneBlockCon.CreateNewBlock(SceneBlockContainer.Targets.Attack, randBlockNum, nowHitPositionRelative);
sceneBlockCon.CreateNewBlock(SceneBlockContainer.Targets.Attack, blockLevel, blockNum, nowHitPositionRelative);
sceneBlockCon.InitializeBlock(environmentObj);
targetCon.AttackModeChange(nowHitPositionRelative);
ChangeMouseModeTo(MouseMode.Default);
ChangeMouseMode(MouseMode.Default);
}
break;
@@ -83,15 +89,15 @@ public class MouseInMap : MonoBehaviour
{
// if agent or enemy is nearby, do not create new block
messageCon.PushMessage(new List<string> { "Agent or Enemy is too close!" },
new List<string> { "#800000ff" });
new List<string> { messageCon.errorColor });
}
else
{
// if agent or enemy is not nearby, create new block
sceneBlockCon.CreateNewBlock(SceneBlockContainer.Targets.Go, randBlockNum, nowHitPositionRelative);
sceneBlockCon.CreateNewBlock(SceneBlockContainer.Targets.Go, blockLevel, blockNum, nowHitPositionRelative);
sceneBlockCon.InitializeBlock(environmentObj);
targetCon.GotoModeChange(nowHitPositionRelative);
ChangeMouseModeTo(MouseMode.Default);
ChangeMouseMode(MouseMode.Default);
}
break;
@@ -99,7 +105,7 @@ public class MouseInMap : MonoBehaviour
if (IsAgentorEnemyWithinDistance(enemyDistanceThreshold))
{
messageCon.PushMessage(new List<string> { "Agent or Enemy is too close!" },
new List<string> { "#800000ff" });
new List<string> { messageCon.errorColor });
}
else
{
@@ -114,31 +120,55 @@ public class MouseInMap : MonoBehaviour
}
}
public void ChangeMouseModeTo(MouseMode thisMouseMode)
// change mouse mode, level and PreviewModel
public void ChangeMouseMode(MouseMode mouseMode, int level = -1, int blockNum = -1)
{
mouseMode = thisMouseMode;
switch (thisMouseMode)
this.mouseMode = mouseMode;
SceneBlockContainer.Targets nowTargetType;
switch (mouseMode)
{
case MouseMode.AttackSet:
// random choose attack scene block type and set as preview
randBlockNum = Random.Range(0, sceneBlockCon.attackBlockPrefabs.Length);
preSet = sceneBlockCon.attackBlockPrefabs[randBlockNum];
mousePreviewCon.ChangePreviewTo(preSet);
break;
case MouseMode.GotoSet:
// random choose Goto scene block type and set as preview
randBlockNum = Random.Range(0, sceneBlockCon.goBlockPrefabs.Length);
preSet = sceneBlockCon.goBlockPrefabs[randBlockNum];
mousePreviewCon.ChangePreviewTo(preSet);
// set target type
nowTargetType = GetTargetTypeByMouseMode(mouseMode);
// set blockLevel or send error message
if (level < 0)
{
// while blockLevel is not set, send error message
messageCon.PushMessage(new List<string> { "[ERROR]MouseInMap:ChangeMouseMode:", "Level not set!", "mouseMode=", mouseMode.ToString() },
new List<string> { messageCon.errorColor });
blockLevel = sceneBlockCon.scenePrefabSet.GetLevelNumber(nowTargetType);
}
else
{
// while blockLevel is set
blockLevel = level;
}
blockLevel = level;
// set blockNum or random choose attack scene block type
if (blockNum < 0)
{
// while blockNum is not set, random choose block type
this.blockNum = Random.Range(0, sceneBlockCon.scenePrefabSet.GetBlockNumber(nowTargetType, blockLevel));
}
else
{
// while blockNum is set
this.blockNum = blockNum;
}
// set previewModel
previewModel = sceneBlockCon.scenePrefabSet.GetPrefab(nowTargetType, blockLevel, this.blockNum);
mousePreviewCon.ChangePreviewTo(previewModel);
break;
case MouseMode.EnemySet:
preSet = enemyCon.enemyPrefab;
mousePreviewCon.ChangePreviewTo(preSet, true);
// set enemy as preview
previewModel = enemyCon.enemyPrefab;
mousePreviewCon.ChangePreviewTo(previewModel, true);
break;
default:
// default mode, delete all preview model
mousePreviewCon.DeleteAllPreviewModele();
break;
}
@@ -148,14 +178,14 @@ public class MouseInMap : MonoBehaviour
public Vector3 GetMouseOnMapPosition()
{
// shoot raycast from mainCamera center to mousepositon
RaycastHit thisHit;
RaycastHit nowHit;
Ray ray = playCamera.ScreenPointToRay(Input.mousePosition);
// if raycast hit gameobject
if (Physics.Raycast(ray, out thisHit, Mathf.Infinity, groundMask))
if (Physics.Raycast(ray, out nowHit, Mathf.Infinity, groundMask))
{
//draw raycast
Debug.DrawRay(ray.origin, ray.direction * 100, Color.red);
return thisHit.point;
return nowHit.point;
}
else
{
@@ -163,6 +193,7 @@ public class MouseInMap : MonoBehaviour
}
}
// check if agent or enemy is too close to nowHitPosition
private bool IsAgentorEnemyWithinDistance(float distance)
{
// check all child object in enemyContainerObj
@@ -190,4 +221,22 @@ public class MouseInMap : MonoBehaviour
// if no enemy or agent near by, return false
return false;
}
// change to TargetType from MouseMode
private SceneBlockContainer.Targets GetTargetTypeByMouseMode(MouseMode mode)
{
switch (mode)
{
case MouseMode.AttackSet:
return SceneBlockContainer.Targets.Attack;
case MouseMode.GotoSet:
return SceneBlockContainer.Targets.Go;
default:
messageCon.PushMessage(new List<string> { "[Error]MouseInMap:GetTargetTypeByMouseMode:", "Mouse Mode not found!", "mode=", mode.ToString() },
new List<string> { messageCon.errorColor });
return SceneBlockContainer.Targets.Num;
}
}
}
+11 -6
View File
@@ -30,7 +30,7 @@ public class TargetUIController : MonoBehaviour
{
// Clear all enemies and targets. set gamemode to Stay mode
targetCon.StayModeChange();
mouseInMapCon.ChangeMouseModeTo(MouseInMap.MouseMode.Default);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
// disable setStayButton and enable other buttons
setStayButton.interactable = false;
setAttackButton.interactable = true;
@@ -41,12 +41,12 @@ public class TargetUIController : MonoBehaviour
public void SetEnemyPressed()
{
mouseInMapCon.ChangeMouseModeTo(MouseInMap.MouseMode.EnemySet);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.EnemySet);
}
public void SetGotoPressed()
{
mouseInMapCon.ChangeMouseModeTo(MouseInMap.MouseMode.GotoSet);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.GotoSet);
setStayButton.interactable = true;
setAttackButton.interactable = true;
setGotoButton.interactable = false;
@@ -55,7 +55,7 @@ public class TargetUIController : MonoBehaviour
public void SetAttackPressed()
{
mouseInMapCon.ChangeMouseModeTo(MouseInMap.MouseMode.AttackSet);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.AttackSet);
setStayButton.interactable = true;
setAttackButton.interactable = false;
setGotoButton.interactable = true;
@@ -64,7 +64,7 @@ public class TargetUIController : MonoBehaviour
public void SetFreePressed()
{
mouseInMapCon.ChangeMouseModeTo(MouseInMap.MouseMode.Default);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
targetCon.FreeModeChange();
setStayButton.interactable = true;
setAttackButton.interactable = true;
@@ -74,11 +74,16 @@ public class TargetUIController : MonoBehaviour
public void SetStayPressed()
{
mouseInMapCon.ChangeMouseModeTo(MouseInMap.MouseMode.Default);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
targetCon.StayModeChange();
setStayButton.interactable = false;
setAttackButton.interactable = true;
setGotoButton.interactable = true;
setFreeButton.interactable = true;
}
public void ShowLevelMenu(GameObject levelPanel)
{
}
}