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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

1回答

631閲覧

Runゲームのソースコードの解読。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2019/08/10 19:03

編集2019/08/10 19:04

前提・実現したいこと

書籍に掲載されているRunゲームのステージ生成ロジックにおいてわからない箇所があるので、
質問させていただきます。
なお、書籍に掲載されている内容ということを踏まえて(著者の方の利益を考慮して)、
ソースコードは全部載せず、わからない箇所だけ抜粋します。
ご教示お願いします。

該当のソースコード

キャラクターの走る先にステージチップを生成していくロジックのようです。

C#

1 const int StageTipSize = 30; 2 3 int currentTipIndex; 4 5 public Transform character; //ターゲットキャラクターの指定。 6 public GameObject[] stageTips; //ステージチッププレファブ配列。 7 public int startTipIndex; //自動生成開始インデックス。 8 public int preInstantiate; //生成先読み個数。 9 public List<GameObject> generatedStageList = new List<GameObject>(); //生成済みステージチップ保持リスト。 10 11 //初期化処理。 12 void Start () 13 { 14 currentTipIndex = startTipIndex - 1; 15 UpdateStage(preInstantiate); 16 } 17 18 //ステージの更新タイミングの監視。 19 void Update () 20 { 21 // キャラクターの位置から現在のステージチップのインデックスを計算 22 int charaPositionIndex = (int)(character.position.z / StageTipSize); 23 24 // 次のステージチップに入ったらステージの更新処理をおこなう 25 if (charaPositionIndex + preInstantiate > currentTipIndex) 26 { 27 UpdateStage(charaPositionIndex + preInstantiate); 28 } 29 } 30 31 // 指定のIndexまでのステージチップを生成して、管理化に置く 32 void UpdateStage (int toTipIndex) 33 { 34 if(toTipIndex <= currentTipIndex) return; 35 36 // 指定のステージチップまでを作成 37 for (int i = currentTipIndex + 1; i <= toTipIndex; i++) 38 { 39 GameObject stageObject = GenerateStage(i); 40 41 // 生成したステージチップを管理リストに追加し 42 generatedStageList.Add(stageObject); 43 } 44 45 // ステージ保持上限内になるまで古いステージを削除 46 while (generatedStageList.Count > preInstantiate + 2) DestroyOldestStage(); 47 48 currentTipIndex = toTipIndex; 49 } 50 51 // 指定のインデックス位置にStageオブジェクトをランダムに生成 52 GameObject GenerateStage (int tipIndex) 53 { 54 (省略) 55 } 56 57 // 一番古いステージを削除 58 void DestroyOldestStage () 59 { 60 (省略) 61 } 62

試したこと

だいたい解読できたのですが、2点わかりませんでした。

・1点目。
初期化処理で、

C#

1currentTipIndex = startTipIndex - 1;

なぜ、startTipIndexに-1したものをcurrentTipIndexに入れているのでしょうか?
この-1の意味とかがよくわからないです。

・2点目。

C#

1// ステージ保持上限内になるまで古いステージを削除 2while (generatedStageList.Count > preInstantiate + 2) DestroyOldestStage();

このコードがわかりません。
preInstantiate + 2
なぜ、+2なのでしょうか?
例えば、先読み個数(preInstantiate)があって、他にcharaPositionIndexにあるステージの数が1なので、
preInstantiate + 1
ならわかる気がするのですが。

DestroyOldestStage()内では、generatedStageList.RemoveAt(0)で削除している記述が見られるので、
generatedStageList.Countは常に増え続けないということはわかります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どんな本か、どんな感じのRunゲームか、ステージがどんな長さなのかも不明なので完全に想像です。

startTipIndexに-1したものをcurrentTipIndexに入れているのでしょうか?

多分、-1しているのは

for (int i = currentTipIndex + 1; i <= toTipIndex; i++)

でループ初期値を+1しているからで、+1しているのは最後尾(今構築している最大インデックスのステージ)の次から構築したいからでしょうね。
またはpreInstantiateが0の時でも確実に一つは読み込ませておきたいとかでしょうか。
要はつじつま合わせに見えます。

なぜ、+2なのでしょうか?

「今挑むステージとその直前の計2ステージ分」は最低でも残しておきたいからとかだと思います。
preInstantiateが0だった時を考えてみるとよくわかると思います。
まぁ、だとしてもほかのところでいろいろおかしい文はありますが...

自分もたまにやってしまうのであまり偉そうに言える立場ではないですが、正直このソースだけを見ていると「ここをこうしたらこうなったからこうした」的なのがちらほら見え隠れを感じました...
なので、お望みの回答になっていないかもしれません。

投稿2019/08/11 02:00

vo3

総合スコア321

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

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

退会済みユーザー

退会済みユーザー

2019/08/11 16:11

ご回答ありがとうございます。 -1の理由がわかりました、ありがとうございます。 また、+2の理由もわかりました。 >preInstantiateが0だった時を考えてみる なるほど、こちら全く思いつきませんでした。とても勉強になります。 実際に試したところ、おっしゃったように、計2ステージ分だけが残されていました。 全て理解できた今、改めて考えてみると、確かに辻褄合わせのようなコードに感じました。 自分でアレンジして、わかりやすいコードで書くようにしたいと思います。 ご教示ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問