質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

4201閲覧

unityでメインゲーム場面のプログラム設計に行き詰まっています。

ba_max009

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2018/01/10 15:55

unityでスコットランドヤードというボードゲームを作成することになったのですが、メインゲーム場面のプログラム設計方法にいきづまっています。
ゲーム開発初心者で、ほとんど泣き言のようなことなのですが、どのようにプログラムを書いていけばうまくいくのかわからなくなってしまったので、先人の知恵として方向性を教えていただきたく思い書き込みました。

イメージ説明

このような盤面でマス(プレイヤーが動けるところ)が199マスあります。
それぞれ現在いるマスによって動ける条件が異なります。
詳しくは(スコットランドヤード ルール)を見ていただいた方がわかりやすいかもしれません。

このようなゲームで、現在、マスには複数のボタンを配置しており、ボタンを押すとそのマスの番号とそのマスと繋がっているマスの情報がわかるようになっています。

ここから、どうすればうまくゲームとして成り立つか行き詰まっています。
特に、プレイヤーをマスの上に表示・移動させる方法がわかりません。

自分だったらこうやって作るという考えがあれば教えていただきたく思います。

自分自身わからない点がまとまっておらず、わかりにくい文章となってしまいすみません。
不明な点など、あれば、質問してください。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2018/01/11 00:27

「マスには複数のボタンを配置しており」というのは、バス、タクシー、地下鉄のボタンですか?
ba_max009

2018/01/11 01:16

いえ、それぞれのマスに一つボタンを置いています。
guest

回答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}

まずこのNodeid1〜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
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ba_max009

2018/01/11 14:39

回答ありがとうございます! ノードを生成したり、各ノードの情報を記述するのは、一番上のノードクラスに追加で書き込みということであっていますでしょうか?
masaya_ohashi

2018/01/12 00:14

うーん、ノードクラスは「情報を持つ」機能だけにして、sakura_hanaさんの回答のようにゲーム管理クラスがノードを生成して持ち、ノードの関連性を持たせる処理等もゲーム管理クラスが持つべきかと思います。ノードクラスに機能を追加するとしたら、マップ上のXY座標の管理くらいでしょうか。
guest

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

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問