unityでスコットランドヤードというボードゲームを作成することになったのですが、メインゲーム場面のプログラム設計方法にいきづまっています。
ゲーム開発初心者で、ほとんど泣き言のようなことなのですが、どのようにプログラムを書いていけばうまくいくのかわからなくなってしまったので、先人の知恵として方向性を教えていただきたく思い書き込みました。
このような盤面でマス(プレイヤーが動けるところ)が199マスあります。
それぞれ現在いるマスによって動ける条件が異なります。
詳しくは(スコットランドヤード ルール)を見ていただいた方がわかりやすいかもしれません。
このようなゲームで、現在、マスには複数のボタンを配置しており、ボタンを押すとそのマスの番号とそのマスと繋がっているマスの情報がわかるようになっています。
ここから、どうすればうまくゲームとして成り立つか行き詰まっています。
特に、プレイヤーをマスの上に表示・移動させる方法がわかりません。
自分だったらこうやって作るという考えがあれば教えていただきたく思います。
自分自身わからない点がまとまっておらず、わかりにくい文章となってしまいすみません。
不明な点など、あれば、質問してください。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/11 01:16
回答2件
0
※あまりC#を使ったことがないので、構文等に間違いがあったらごめんなさい。ニュアンスで感じてください。
こういう点と点を結んだデータのことをプログラムでは「ノード」と呼びます。ノードは「繋がり」のデータを持っており、自身から別のノードへの繋がりを表現しています。
C#
1class Node { 2 private int id; // このマスの番号 3 private IList<Node> taxi; // このマスからタクシーで移動できるノードのリスト 4 private IList<Node> bus; // このマスからバスで移動できるノードのリスト 5 private IList<Node> subway; // このマスから地下鉄で移動できるノードのリスト 6 private IList<Node> ship; // このマスから船で移動できるノードのリスト 7 8 public Node(int id) { 9 this.id = id; 10 this.taxi = new List<Node>(); 11 this.bus = new List<Node>(); 12 this.subway = new List<Node>(); 13 this.ship = new List<Node>(); 14 } 15 16 public void AddTaxi(Node n) { 17 taxi.Add(n); 18 } 19 20 public void AddBus(Node n) { 21 bus.Add(n); 22 } 23 24 public void AddSubway(Node n) { 25 subway.Add(n); 26 } 27 28 public void AddShip(Node n) { 29 ship.Add(n); 30 } 31 32 public int GetId() { 33 return id; 34 } 35 36 public IList<Node> GetTaxiNodes(){ 37 return taxi; 38 } 39 40 public IList<Node> GetBusNodes(){ 41 return bus; 42 } 43 44 public IList<Node> GetSubwayNodes(){ 45 return subway; 46 } 47 48 public IList<Node> GetShipNodes(){ 49 return ship; 50 } 51 52 // 省略 53}
まずこのNode
をid
1〜199まで生成してDictionary
にでも入れておきます。
C#
1IDictionary nodes = new Dictionary<int, Node>(); 2for(int i=1;i<=199;i++) { 3 nodes.Add(i, new Node(i)); 4}
次に、ノードの相互の関係性を入力していきます。例えばあなたの貼った画像では1のマスから移動できるのは以下のようになっていると思います。これらの情報を元に、丁寧にコーディングしていきます。
- タクシー:8,9
- バス:46,58
- 地下鉄:46
- 船:無し
C#
1Node n1 = nodes[1]; 2n1.AddTaxi(nodes[8]); 3n1.AddTaxi(nodes[9]); 4n1.AddBus(nodes[46]); 5n1.AddBus(nodes[58]); 6n1.AddSubway(nodes[46]);
このように関連性を各ノードに覚えさせておけば、後から「1のマスからタクシーで移動できるのはどのマスかな?」となったときに以下のように取り出すことが出来ます。
C#
1Node n = nodes[1]; 2IList<Node> taxiNodes = n.GetTaxiNodes(); 3for(Node taxi in taxiNodes) { 4 Console.WriteLine(taxi.GetId()); // 8 9と出力される 5}
あとは、プレイヤーがどのノードidの場所にいるか、どのノードが画面上のどこにあるかを管理しておけばゲームの盤面は作れるのではないでしょうか。
投稿2018/01/11 00:59
編集2018/01/11 01:01総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/11 14:39
2018/01/12 00:14
0
ベストアンサー
私的意見なので参考までにどうぞ。
(現状どう作っているか分からないので1から書きます)
・マップ画像は固定っぽいので、1枚の背景画像として配置。
・その上に透明なボタンオブジェクトを199個配置。(以降「街ボタン」と呼称)
・各プレイヤーのマーカー画像を作成しておく。(以降「プレイヤーオブジェクト」と呼称)
・「街クラス」を作って、各街ボタンのオブジェクトに付与。
・「プレイヤークラス」を作って、各プレイヤーオブジェクトに付与。
・「ゲーム管理クラス」を作って、シーン上に1つだけ配置したオブジェクトに付与。
・街ボタンを押された時の処理は、「ゲーム管理クラス」のボタンが押された時の処理を呼び出すように設定しておく(その際自分の街クラスを渡す)。
(数多いので自動化してもよい→「unity AddListner」で検索)
・プレイヤーの表示は「自身が居る街ボタンの座標」が分かればよい。
(その座標+オフセットな位置にプレイヤー画像を移動させればいい)
ざっくりスクリプトを書くと以下の通りです。
要点のみなので実用時は適宜変更・追加してもらえればと思います。
C#
1//街クラス 2//各パラメータをインスペクタから設定しておく 3public class Town : MonoBehaviour { 4 public int id; 5 public Town[] taxiConnections; //タクシーで移動出来る他の街 6 public Town[] busConnections; //バスで移動出来る他の街 7 //...移動手段の分だけ配列を作る。その移動手段で行ける街が無い場合は配列を空にしておく 8} 9 10//プレイヤークラス 11public class Player : MonoBehaviour { 12 public int id; 13 public bool isCriminal; //犯人かどうか 14 private Town nowTown; 15 private GameController gameController; 16 17 //自分の手番 18 public void MyTurn () { 19 //nowTownを参照して、移動出来る街のボタンを有効化する。 20 //犯人の場合は処理を変えたりする。 21 } 22 23 //移動先が選択された 24 public void Move (town) { 25 //まず有効化していた街ボタンを全てオフにする。 26 27 //town = 移動先の街クラス なので 28 transform.position = town.transfrom.position; 29 //で目的の街ボタンオブジェクトの位置にこのプレイヤーオブジェクトが移動する。 30 31 //どの移動手段を使ったかは、townがnowTownの配列のどれに属しているかを調べればわかる。(もしくは街クラスに判定用フラグを持たせてもいい) 32 33 //全ての移動処理が終わったら 34 nowTown = town; 35 //してGameControllerのメインループかターンエンド処理を呼ぶ。 36 } 37} 38 39 40//ゲーム管理クラス(ざっくり記載) 41public class GameController : MonoBehaviour { 42 public Player[] players; 43 private Player nowPlayer; 44 45 //メインループ:各プレイヤーの手番管理 46 void MainLoop() { 47 //指定のプレイヤーの手番を呼び出す 48 nowPlayer = playes[0]; //イメージ 49 nowPlayer.MyTurn(); 50 } 51 52 //ゲーム開始時の処理とか 53 //ゲーム終了時の処理とか 54 //プレイヤーの手番終了時の処理とか 55 56 //街ボタンが押された 57 public void PushTownButton (Town town) { 58 nowPlayer.Move(town); 59 } 60} 61
投稿2018/01/11 01:03
総合スコア11425
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。