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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

0回答

1326閲覧

シーン遷移時に停止してしまいます

ForceTask

総合スコア0

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/08/14 05:36

編集2021/08/14 06:19

Unityで3DのRPGを作っています。
参考にしているサイト~かめくめちゃん~

このサイトの通りにゲームの制作をしているのですが、シーン遷移後に停止されます。

#原因(?)
Box colliderの当たり判定フェードを介してシーンを遷移させると、
イメージ説明
から暗転し、シーンは変わりますが全く動かなくなります。
![イイメージ説明
のようになって固まってしまいます。
固まってしまう原因がわかりません。

しかもシーンが切り替わった後に ▷ボタンの横の||ボタンを押すとしっかりと動きます。どうしてでしょうか?
下に表示されていたエラーは次の通りです。
エラーはUnity側でしか表示されていません。
イメージ説明
エラーが出ていたスクリプトを下に示します。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6public class SceneLoadingPosition : MonoBehaviour { 7 [SerializeField] 8 private SceneMovementData sceneMovementData = null; 9 10 void Start() { 11 12 // シーン遷移の種類に応じて初期位置のゲームオブジェクトの位置と角度に設定 13 if (sceneMovementData.GetSceneType() == SceneMovementData.SceneType.StartGame) { 14 var initialPosition = GameObject.Find("InitialPosition").transform; 15 transform.position = initialPosition.position; 16 transform.rotation = initialPosition.rotation; 17 } else if (sceneMovementData.GetSceneType() == SceneMovementData.SceneType.FirstVillage) { 18 var initialPosition = GameObject.Find("InitialPosition").transform; 19 transform.position = initialPosition.position; 20 transform.rotation = initialPosition.rotation; 21 } else if (sceneMovementData.GetSceneType() == SceneMovementData.SceneType.FirstVillageToWorldMap) { 22 var initialPosition = GameObject.Find("InitialPositionFirstVillageToWorldMap").transform; 23 transform.position = initialPosition.position; 24 transform.rotation = initialPosition.rotation; 25 } 26 } 27}

イメージ説明
SceneLoadingPosition.csの14行目

c#

1 2using System.Collections; 3using System.Collections.Generic; 4using System.Text.RegularExpressions; 5using UnityEngine; 6using UnityEngine.UI; 7 8public class UnityChanTalkScript : MonoBehaviour 9{ 10 // 会話可能な相手 11 private GameObject conversationPartner; 12 // 会話可能アイコン 13 [SerializeField] 14 private GameObject talkIcon = null; 15 16 17 // TalkUIゲームオブジェクト 18 [SerializeField] 19 private GameObject talkUI = null; 20 // メッセージUI 21 private Text messageText = null; 22 // 表示するメッセージ 23 private string allMessage = null; 24 // 使用する分割文字列 25 [SerializeField] 26 private string splitString = "<>"; 27 // 分割したメッセージ 28 private string[] splitMessage; 29 // 分割したメッセージの何番目か 30 private int messageNum; 31 // テキストスピード 32 [SerializeField] 33 private float textSpeed = 0.05f; 34 // 経過時間 35 private float elapsedTime = 0f; 36 // 今見ている文字番号 37 private int nowTextNum = 0; 38 // マウスクリックを促すアイコン 39 [SerializeField] 40 private Image clickIcon = null; 41 // クリックアイコンの点滅秒数 42 [SerializeField] 43 private float clickFlashTime = 0.2f; 44 // 1回分のメッセージを表示したかどうか 45 private bool isOneMessage = false; 46 // メッセージをすべて表示したかどうか 47 private bool isEndMessage = false; 48 49 void Start() { 50 clickIcon.enabled = false; 51 messageText = talkUI.GetComponentInChildren<Text>(); 52 } 53 54 void Update() { 55 // メッセージが終わっているか、メッセージがない場合はこれ以降何もしない 56 if (isEndMessage || allMessage == null) { 57 return; 58 } 59 60 // 1回に表示するメッセージを表示していない 61 if (!isOneMessage) { 62 // テキスト表示時間を経過したらメッセージを追加 63 if (elapsedTime >= textSpeed) { 64 messageText.text += splitMessage[messageNum][nowTextNum]; 65 66 nowTextNum++; 67 elapsedTime = 0f; 68 69 // メッセージを全部表示、または行数が最大数表示された 70 if (nowTextNum >= splitMessage[messageNum].Length) { 71 isOneMessage = true; 72 } 73 } 74 elapsedTime += Time.deltaTime; 75 76 // メッセージ表示中にマウスの左ボタンを押したら一括表示 77 if (Input.GetButtonDown("Jump")) { 78 // ここまでに表示しているテキストに残りのメッセージを足す 79 messageText.text += splitMessage[messageNum].Substring(nowTextNum); 80 isOneMessage = true; 81 } 82 // 1回に表示するメッセージを表示した 83 } else { 84 85 elapsedTime += Time.deltaTime; 86 87 // クリックアイコンを点滅する時間を超えた時、反転させる 88 if (elapsedTime >= clickFlashTime) { 89 clickIcon.enabled = !clickIcon.enabled; 90 elapsedTime = 0f; 91 } 92 93 // マウスクリックされたら次の文字表示処理 94 if (Input.GetButtonDown("Jump")) { 95 nowTextNum = 0; 96 messageNum++; 97 messageText.text = ""; 98 clickIcon.enabled = false; 99 elapsedTime = 0f; 100 isOneMessage = false; 101 102 // メッセージが全部表示されていたらゲームオブジェクト自体の削除 103 if (messageNum >= splitMessage.Length) { 104 EndTalking(); 105 } 106 } 107 } 108 } 109 110 private void LateUpdate() { 111 // 会話相手がいる場合はTalkIconの位置を会話相手の頭上に表示 112 if (conversationPartner != null) { 113 talkIcon.transform.Find("Panel").position = Camera.main.GetComponent<Camera>().WorldToScreenPoint(conversationPartner.transform.position + Vector3.up * 2f); 114 } 115 } 116 117 // 会話相手を設定 118 public void SetConversationPartner(GameObject partnerObj) { 119 talkIcon.SetActive(true); 120 conversationPartner = partnerObj; 121 } 122 123 // 会話相手をリセット 124 public void ResetConversationPartner(GameObject parterObj) { 125 // 会話相手がいない場合は何もしない 126 if(conversationPartner == null) { 127 return; 128 } 129 // 会話相手と引数で受け取った相手が同じインスタンスIDを持つなら会話相手をなくす 130 if(conversationPartner.GetInstanceID() == parterObj.GetInstanceID()) { 131 talkIcon.SetActive(false); 132 conversationPartner = null; 133 } 134 } 135 // 会話相手を返す 136 public GameObject GetConversationPartner() { 137 return conversationPartner; 138 } 139 140 // 会話を開始する 141 public void StartTalking() { 142 var villagerScript = conversationPartner.GetComponent<VillagerScript>(); 143 villagerScript.SetState(VillagerScript.State.Talk, transform); 144 this.allMessage = villagerScript.GetConversation().GetConversationMessage(); 145 // 分割文字列で一回に表示するメッセージを分割する 146 splitMessage = Regex.Split(allMessage, @"\s*" + splitString + @"\s*", RegexOptions.IgnorePatternWhitespace); 147 // 初期化処理 148 nowTextNum = 0; 149 messageNum = 0; 150 messageText.text = ""; 151 talkUI.SetActive(true); 152 talkIcon.SetActive(false); 153 isOneMessage = false; 154 isEndMessage = false; 155 // 会話開始時の入力は一旦リセット 156 Input.ResetInputAxes(); 157 } 158 // 会話を終了する 159 void EndTalking() { 160 isEndMessage = true; 161 talkUI.SetActive(false); 162 // ユニティちゃんと村人両方の状態を変更する 163 var villagerScript = conversationPartner.GetComponent<VillagerScript>(); 164 villagerScript.SetState(VillagerScript.State.Wait); 165 GetComponent<UnityChanScript>().SetState(UnityChanScript.State.Normal); 166 Input.ResetInputAxes(); 167 } 168}

イメージ説明
UnityChanTalkScript.csの50行目


追記

VillageのUnityChanにはFirstVillageデータを設定しており
イメージ説明
WorldMapのUnityChanにはWorldMapデータを設定しています。
イメージ説明
シーン遷移後に停止してしまう理由等をお願い致します。

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

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

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

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

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

fiveHundred

2021/08/14 05:45

sceneMovementDataとはどういうもので、どう設定しておりますか?
ForceTask

2021/08/14 06:09

シーン遷移時にユニティちゃんの位置や角度を決めるためのデータファイル(ScriptableObjectのファイル)です。 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; [Serializable] [CreateAssetMenu(menuName = "CreateSceneMovementData/SceneMovementData")] public class SceneMovementData : ScriptableObject { public enum SceneType { StartGame, FirstVillage, FirstVillageToWorldMap } [SerializeField] private SceneType sceneType; public void OnEnable() { sceneType = SceneType.StartGame; } public void SetSceneType(SceneType scene) { sceneType = scene; } public SceneType GetSceneType() { return sceneType; } }
ForceTask

2021/08/14 06:22

逆に、WorldMapからVillageへの遷移は普通にできます。
fiveHundred

2021/08/14 06:34

public void OnEnable() { sceneType = SceneType.StartGame; } 上記のようにすると、有効時に毎回「SceneType.StartGame」が「sceneType」に代入されるので、「sceneType」の指定が無意味になっている気がします。 実際、エラー箇所が「sceneMovementData.GetSceneType() == SceneMovementData.SceneType.StartGame」の中ですし、本当ならば「sceneMovementData.GetSceneType() == SceneMovementData.SceneType.FirstVillageToWorldMap」の中が実行されないといけないような感じだと思いますが、そこについての意図はどうなっていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問