MonoBehaviourさんはNewさせない。
とりあえず進捗
①既存ゲームファイルがない場合「続ける」ボタンを非活性かする
②newゲームボタンで、所定の画面へ線維
③それなりの会話を表示させる。
ここまで動けば割と楽しいですね。このペースで進めばまぁ、なんとか終わるだろう。ただし、ストーリーがない。追いついていない。そしてイメージファイルもない。作らなければ。今年中に公開したいな・・・。
どんどん伸びているけど、気にしない。趣味だし。嫌いになるよりはだらだらやりますお。
unityはオブジェクトにスクリプトをつけるのよ
というのが、基本の考えだそう。
ふーんそうなんだというくらいしか考えていなかったけど、一番はじめにUnityでC#やっていた時に詰まったので、記事にしておきましょう。
さて、以下はCSVを呼び出すクラスです。なんども書いているので、説明は割愛。
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class CsvReader : MonoBehaviour { //読み込むCSVファイル private TextAsset csvFile; //表示用シナリオ(退避用CSV) private List<string[]> scenarioList = new List<string[]>(); //シナリオ行数カウンタ private int csvCount = 0; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } public List<string[]> CsvRead (string scenarioName){ csvCount = 0; csvFile = Resources.Load ("Scenarios/" + scenarioName) as TextAsset; StringReader reader = new StringReader (csvFile.text); //csvファイルを取得 while (reader.Peek () > -1) { string line = reader.ReadLine (); scenarioList.Add (line.Split (',')); csvCount++; } return scenarioList; } }
そして、メインのオブジェクト(今回はCanvas)には、このシーンを制御する、「NewGameController.cs」がいらっしゃいます。
この中で、CsvReader.csを使いたい。ね。普通の考え方だよね。
で、ここでネックになるのが、「Unityさんはオブジェクトにスクリプトコンポーネントをつけて使用する」ということ。
作成したスクリプトは、まず、どれかしらのオブジェクトにつけておく必要があります。
裏方さんでいらっしゃっても、必要。
裏方さんもメインのスクリプトさんと一緒にいた方が楽なので、同じオブジェクトにつけます。できるだけね。
私は基本、主なスクリプトはCanvasに集めています。
空のゲームオブジェクトにスクリプト集めている方もいらっしゃいましたね。それはそれで見やすいね。
んで、以下はメインさん。
public class NewGameController : MonoBehaviour { //シナリオCSV取得クラス private CsvReader csvReader; // Use this for initialization void Start () { csvReader = new CsvReader(); } }
一見、普通のC#クラスだと考えれば、普通です。行けそうです。
しかし、MonoBehaviourクラスでは、怒ります。
以下がエラー内容。
You are trying to create a MonoBehaviour using the ‘new’ keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
CsvReader:.ctor() (at Assets/PlugIns/CsvReader.cs:14)
NewGameController:Start() (at Assets/Scripts/NewGameController.cs:24)
簡単にいうと、Newキーワード許さねーぞ。componentから取得しやがれ。ということ。
上記を回避するためには、以下の通り、Newではなく、オブジェクトに付いているスクリプトコンポーネントを見つけて来るようにさせます。
以下の通り。
public class NewGameController : MonoBehaviour { //シナリオCSV取得クラス private CsvReader csvReader; // Use this for initialization void Start () { csvReader = GetComponent<CsvReader> (); } }
この場合は、同じオブジェクトに付いている、を見つけに行っています。
別のオブジェクトのものをGetすることももちろん可能。
個人的には、あまり好きじゃないのでこっちにする。