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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

22766閲覧

unityのC#でIndexOutOfRangeException: Array index is out of range等4個のエラー

Takaha

総合スコア24

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2016/07/19 10:19

###前提・実現したいこと
打ち込まれた文字列から特定の文字列の湯有無を判定し、適当な言葉を返す人工無能の試作品(製作中)

###発生している問題・エラーメッセージ

IndexOutOfRangeException: Array index is out of range. SaveScript.SaveText () (at Assets/script/SaveScript.cs:36) NullReferenceException: Object reference not set to an instance of an object SaveScript.Start () (at Assets/script/SaveScript.cs:24) UnassignedReferenceException: The variable unity of SaveScript has not been assigned. You probably need to assign the unity variable of the SaveScript script in the inspector.

###該当のソースコード

using UnityEngine; using UnityEngine.UI; using System.Collections; public class SaveScript : MonoBehaviour { string str; string que; string before; string after; string namae; public InputField inputField; public Text text; public Text talk; public Text feel; public InputField your; int i; int a; public GameObject unity; int feeling = 2; void Start () { talk.text = "はじめまして私unity、私とおしゃべりしませんか?"; unity.GetComponent<Animator> ().SetBool ("talk", true); } public void SaveText () { str = inputField.text; text.text = str; before = str; namae = your.text; //普通なら辞書にあたる部分 string[] gimon = { "私", "わたし", "わたくし", "俺", "おれ", "自分", "じぶん", "僕", "ぼく" }; for (a = 0; a <= 9; a++) { que = before.Replace (gimon [a], "なぜあなた"); } string[] stArrayData = {"おはよう", "こんにちは", "こんばんは", "めまして", "趣味", "ゲーム", "私", "わたし", "わたくし", "俺", "おれ", "自分", "じぶん", "僕", "ぼく", "人工", "ばか", "莫迦", "馬鹿", "好き", "思う", "そんなことない", "", }; string[] sadhennji = {"・・・", "・・・", "・・・", "あ?", "・・・", "・・・", "・・・", "・・・", "・・・", "・・・" , "",}; string[] hennji = {"おはよう!", "こんにちは!", "こんばんは!", "始めまして!", "あなたの趣味はなんですか?", "私、ゲーム大好きです", que + "か?", que + "か?", que + "か?", que + "か?", que + "か?", que + "か?", que + "か?", que + "か?", que + "か?", "私は人工知能なのでなんとも・・・", "馬鹿って私のことですか!", "馬鹿って私のことですか!" , "馬鹿って私のことですか!", "私も好きです!", "私賢くないのでなのでなんとも・・・", "そうですか?"}; string[] happyhennji = {"おはよう" + namae, "こんにちは" + namae + "!", "こんばんは" + namae + "!" , "始めまして" + namae + "!", "", "", "", "", "", "" , "",}; //ここから普通正規表現等を使う部分 for (i = 0; i <= 100; i++) { switch (feeling) { case 1: after = before.Replace (stArrayData [i], ""); if (!(before == after)) { talk.text = sadhennji [i]; i = 100; } else { if (i <= 100) { talk.text = "よくわかりません"; } }break; case 2: after = before.Replace (stArrayData [i], ""); if (!(before == after)) { talk.text = hennji [i]; i = 100; } else { if (i <= 100) { talk.text = "へぇ~"; } }break; case 3: after = before.Replace (stArrayData [i], ""); if (!(before == after)) { talk.text = happyhennji [i]; unity.GetComponent<Animator> ().SetBool ("talk", false); i = 100; } else { if (i <= 100) { talk.text = "ごめんなさいよくわかりませんでした"; } }break; } } unity.GetComponent<Animator> ().SetBool ("talk", true); } }//savescript

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

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

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

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

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

guest

回答3

0

ベストアンサー

IndexOutOfRangeException: Array index is out of range.
SaveScript.SaveText () (at Assets/script/SaveScript.cs:36)

これは、Arrayのサイズを超えてアクセスしようとした場合に出るエラーです。

int a; for (a = 0; a < 9; a++)

と書かれている箇所がありますが、対象となる配列の長さ分だけループするように書き換えれば、このようなエラーに遭遇しにくくなります

for (int i = 0; i < gimon.Length; ++i)
これは、gimon配列の長さ(9個)だけループします。
もしgimonに文字列を足しても、その分ループする回数が増えてくれます。

for (i = 0; i <= 100; i++) { の箇所も、 for (i = 0; i < stArrayData.Length; i++) { としたほうが無駄がなくなります。


NullReferenceException: Object reference not set to an instance of an object
SaveScript.Start () (at Assets/script/SaveScript.cs:24)

こちらのエラーは、 SaveScript.cs:24 とエラーに書いてあることから、
talk.text にアクセスしようとしている箇所ということが推測できます。
talk にTextオブジェクトをアタッチし忘れているのではないでしょうか?


エラーコードは普通の英語で書かれていますので、まずはGoogle翻訳にでも突っ込んでぼんやりでいいので意味を掴んでみましょう。
例えば「Array index is out of range」はArrayの
そして、自分なりの考えも投稿に書いておくと、回答もつきやすいと思います。

投稿2016/07/19 10:39

kanitaoru

総合スコア204

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

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

Takaha

2016/07/19 11:12

回答とアドバイスありがとうございます! ただtalk.textはちゃんとアタッチしてあって不思議です(他の箇所を修正したら何故か治りました) 英語翻訳は一応エラーが出るたびにやっているんですがそもそもC#に関する知識が皆無なのでエラーの原因がサッパリ解らず… これからC#の勉強をしていきたいと思います! 繰り返しになりますが答えだけでなくこちらの成長に繋がる事も回答して頂いて本当にありがとうございます
guest

0

とりあえず gimon[8] までしかないのに gimon[9] にアクセスしちゃダメです。

投稿2016/07/19 10:34

Zuishin

総合スコア28660

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

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

Takaha

2016/07/19 11:12

回答ありがとうございます!
guest

0

>IndexOutOfRangeException: Array index is out of range.

配列の添字が範囲を超えています

c#

1string[] gimon = { "私", "わたし", "わたくし", "俺", "おれ", "自分", "じぶん", "僕", "ぼく" }; 2 3```で 08 のデータしか用意していないのに 4```c# 5for (a = 0; a <= 9; a++) { 6 que = before.Replace (gimon [a], "なぜあなた"); 7}

で 0~9 のデータにアクセスしようとしていますので 9 でエラーになります。

>NullReferenceException: Object reference not set to an instance of an object

talk が未設定だったりしませんか?
ちゃんと設定(初期化)済みな状態か確認してみてください。

投稿2016/07/19 10:33

HiroshiWatanabe

総合スコア2160

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

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

Takaha

2016/07/19 11:13

回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問