public bool CanAdvance(Loc fm, Dir dir) { Loc to = fm.Forward(dir); if (!(_map.IsRoomOrPassage(fm) && _map.IsRoomOrPassage(to))) { return(false); } // 障害物が配置されているなら進めない if (ExistsObstacle(to)) { return(false); } if (fm.IsDiagonal(to)) // 斜め移動のときは、左右に障害物があるなら進めない { if (_map.IsWall(fm.Row, to.Col) || _map.IsWall(to.Row, fm.Col)) { return(false); } return(true); } return(true); // to に移動できる }
public static IEnumerator Move(GameObject target, Loc fm, Loc to) { var src = fm.ToPosition(); var dst = to.ToPosition(); float speed = fm.IsDiagonal(to) ? Config.DiagonalMoveSpeed : Config.MoveSpeed; float duration = Vector3.Distance(src, dst) / speed; yield return(Lerp(duration, src, dst, pos => { target.transform.position = pos; })); target.transform.position = dst; }
public static IEnumerator MoveEnemy(Enemy enemy, Loc to) { Loc fm = enemy.Loc; var src = fm.ToPosition(); var dst = to.ToPosition(); float speed = fm.IsDiagonal(to) ? Config.DiagonalMoveSpeed : Config.MoveSpeed; float duration = Vector3.Distance(src, dst) / speed; yield return(Lerp(duration, src, dst, pos => { enemy.Position = pos; })); enemy.UpdateLoc(to); }
// カメラ追従 public static IEnumerator MovePlayer(Player player, Loc to) { Loc fm = player.Loc; var src = fm.ToPosition(); var dst = to.ToPosition(); float speed = fm.IsDiagonal(to) ? Config.DiagonalMoveSpeed : Config.MoveSpeed; float duration = Vector3.Distance(src, dst) / speed; yield return(Lerp(duration, src, dst, pos => { player.Position = pos; player.SyncCameraPosition(); })); player.UpdateLoc(to); }