9日目 Unity 昨日の復習と、シーン名の取得と再読み込み
本日は体調がすぐれていなかったため、遅い時間から少しだけ復習しました。。。
昨日のターン制バトルの関数を一通り見直し、一から作成してみました。スクリプトの書き方に関してはおおよそわかるようになり、Unityとの紐づけも少しずつですが感じ取れるようになってきました…!!
後は追加項目として
<バトル終了時のシーン変更>
void BattleEnd()
{
string currentScene = SceneManager.GetActiveScene().name; // 現在のシーン名を取得
SceneManager.LoadScene(currentScene); // 現在のシーンを再読み込み
}
勉強時間合計:17.5h
8日目 Unity ターン制バトルのスクリプト1
今回は、ボタンをクリックしたら相手に攻撃、そのまま相手のターンに切り替わり相手の攻撃まで行います。
A バトルを管理するスクリプト
B キャラクターを管理するスクリプト(ステータスや攻撃、ダメージの関数)
A バトルを管理するスクリプト
public UnitManager player; // Bの情報をPlayerとして取得する
public UnitManager enemy; // Bの情報をEnemyを取得する
public void OnAttackButton() //ボタンを押したら攻撃する関数
ボタンのOnClickにAを付けたオブジェクトを貼り付け、その右の関数をOnAttackButton() に
{
player.Attack(enemy); //Bの public void Attack(UnitManager target)
Enemyturn(); //ターン変更
}
void Enemyturn() //相手のターン(相手の攻撃)
{
enemy.Attack(player); //Bの public void Attack(UnitManager target)
}
B キャラクターを管理するスクリプト(ステータスや攻撃、ダメージの関数)
public int hp; //フィールドにステータス
public int at;
public void Attack(UnitManager target) //攻撃の関数
{
target.Damage(at); //targetにat分攻撃する
}
void Damage(int damage) //ダメージの関数
{
hp -= damage; //at分のダメージを受ける
Debug.Log(name + "は" + damage + "ダメージを受けた");
}
感想
関数の引数がどのように動作しているのか曖昧だった部分が、今回はっきりとわかった気がします!!
public void Attack(UnitManager target) //関数の設定
player.Attack(enemy); //関数を使うときenemyをtargetにいれて考える
public int at;
void Damage(int damage) //関数の設定
target.Damage(at); //関数を使うときatをdamageに入れて考える
分からなくなったらもう一度これを見て自分!!
勉強時間合計:16.5h
7日目 Unity Prefab化したものを利用する、セーブとロード、Json化
<Prefab化したものを利用する>
[SerializeField] Transform parent; //オブジェクトのTransformを取得(親)
[SerializeField] GameObject imagePrehab; //Prefab化したオブジェクトを取得
void Start()
{
//オブジェクトの生成
GameObject image = Instantiate(imagePrehab);
//親要素の設定 ここでいう親要素とはCanvasのこと(Canvasのもとになければimageは表示されない)
image.transform.SetParent(parent ,false); //falseをつけると親要素のポジションを0,0,0に
}
このスクリプトをEmptyに貼り付けると、Parent(imageの親要素はCanvas)とimage Prefabを設定できるようになる
<セーブとロード>
セーブ
string x = "セーブデータ";
PlayerPrefs.SetString("ThisData", x); //SetStringでセーブ、”セーブデータ”は名前、ThisDataはキーコートのようなもの
PlayerPrefs.Save();
ロード
string saveText = PlayerPrefs.GetString("ThisData"); //GetStringでキーコードを指定してロード
Debug.Log(saveText);
<Json化>
{"hp":0 , "at":0 , "currentStage":0} このようにデータを文字列で表示させる方法
現状のデータ、情報を文字列化して表示したいときに使います。
using System;
void Start()
{
PlayerModel player = new PlayerModel(); //生成
string jsonPlayer = JsonUtility.ToJson(player); //文字列に変換
Debug.Log(jsonPlayer); //文字列を表示
//セーブ、ロードした後に復元する方法
player = JsonUtility.FromJson<PlayerModel>(jsonPlayer); //jsonPlayerが復元のコードに
}
[Serializable]
public class PlayerModel //このデータをJson化するには
{
[SerializeField] //これを文字列に変換するという意味
int hp;
[SerializeField]
int at;
[SerializeField]
int currentStage;
}
勉強時間合計:15.5h
今日は少し怠けてしまったなぁ。。。汗
次回から本格的にゲーム制作に取り組んでいけそうなので楽しみです!!
もう一度だけクラスと関数のレッスンを復習してから挑みます!
6日目 最後 オブジェクトのプレファブ化 まとめ
プレファブ化:一度編集したものを再度使えるようにするためのもの
Ex.Textのプレファブ化(一度設定したフォントや文字サイズを保存しておく方法)
①インスペクターから設定を変更
②対象のオブジェクトを、ヒエラルキーからプロジェクト欄にドラッグ
③使うときは。ヒエラルキーに再度ドラッグする
TextなどUIのオブジェクト生成時は、Canvasの中に入れなければならないので注意
感想
本日からC#ではなくUnityの動作がメインになりました。一度触っているとはいえ、スクリプトとの連動やプレファブ化など、スクリプト以外に見なければならないところがあるため複雑に感じますね(今後はもっと…笑)
ただ、目に見える形で動作してくれるため、ゲーム制作においては大変重要な基本中の基本です。
特に、ボタン入力からどのスクリプトが呼び出されるか等の方法は、実際の制作のなかでも悩む部分になってくると思うので、しっかりと身につけたいと思います。
さらに、スクリプトで他のスクリプトやコンポーネントを呼び出す仕組みは、より一層複雑になってきそうで将来が楽しみですねw
勉強時間合計:14.5h
6日目 後半 Unity スクリプトで他のスクリプトやコンポーネントを取得
<他のスクリプトの取得>
A 取得したいスクリプト
B 取得する側のスクリプト
A 取得したいスクリプト
public class TestScript : MonoBehaviour
{
public void TestScriptAA()
{
Debug.Log("TestScriptのコードを実行");
}
}
B 取得する側のスクリプト
[SerializeField] TestScript testScript; //Aに追加されているスクリプトを取得
public void OnClickButton()
{
Debug.Log("ボタンが押されたよ");
testScript.TestScriptAA(); //Aの中にある関数を実行する
}
このスクリプトと結び付けたEmptyを見ると、Test Scriptという枠が現れる。そこにOnClickButton()の機能を付けたいオブジェクトを貼り付ける
<他のオブジェクトのコンポーネントを取得 Ex.text>
A 取得したいText
B 取得する側のスクリプト
B 取得する側のスクリプト
[SerializeField] Text testText; //Textコンポーネントを取得
public void OnClickButton()
{
Debug.Log("ボタンが押されたよ");
testText.text = "高槻かなこ"; //取得したコンポーネントの中のtextを変更
}
このスクリプトと結び付けたEmptyを見ると、Test Textという枠が現れる。そこに
A を貼り付ける
6日目 Unity シーン、ボタン入力、オブジェクトの非表示や破壊
<シーン>
①シーンの作成
シーンの登録 新しいシーンを作成し、File/Build Setting,ヒエラルキーのシーン名をクリックした状態でAdd Open Scenesで登録
②シーンをスクリプトで切り替える
using UnityEngine.SceneManagement; //これを追加しておく
SceneManager.LoadScene("Main"); //これで、この場合はシーンのMainを呼び出す
<ボタン入力の取得>
①UI/ボタンをクリエイト
②スクリプト作成
public void OnClickButton() //関数の設定
{
Debug.Log("ボタンが押されたよ");
SceneManager.LoadScene("Main");
}
このスクリプトをEmptyに追加する
③Canvas/ButtonのButtonコンポーネントにあるOnClickを見て、②のEmptyを貼り付け、そしてその中から②で作った関数のOnClickButtonを選択
<Imageをタップするときの取得>
①UI/Imageを作成し、Event Triggerコンポーネントの追加する。Add New Event Typeで選択する。(Ex.Pointer Down)
②<ボタン入力の取得>の③と同様
<オブジェクトの非表示や破壊>
[SerializeField] GameObject image; //オブジェクトを変数で取得
image.SetActive(false); //オブジェクトの非表示 反対に、表示したいときは(true)に
Destroy(image); //オブジェクトの破壊 (モンスターの破壊時など)
5日目 まとめ
対して内容もないのに、後で見返しやすいように3部作に…w
クラスの生成、使用には様々な用法があるため、今後使っていく際に注目しながら作業を進めていきたいですね。
あともう一つ注意する点
プログラミングをするうえでシンプルにというのは当たり前だが、外からクラスにアクセスできるようにする場合は慎重に
A
public class Playermodel
{
public string name; //publicを付けたら外部からアクセス可能に
public int hp;
public int attack;
Debug.Log(player.name); //これでも取得可能だが、変数にpublicをつけておく必要がある
Debug.Log(player.hp); //しかし、プログラムでは変数をpublicにしないほうが良い
Debug.Log(player.attack);
B
public Playermodel() //生成されたときに呼び出される
{
name = "国木田";
hp = 10;
attack = 5;
}
このようにpublicを付けたら簡単にアクセス可能になるが、その分予期していない自体が発生したり、複数人で作業を進行しているとき不具合が生じやすくなったりする可能性が高いため、基本的にはこのやり方は推奨しないとのことでした。
感想
本日学んだクラスに関しては、Unityの場合は元から備わっているものを使う場合が多いので、どちらかといえばC#の基礎として学びました。しかし、使わなければ定着することもないので、クラスの概念と、関数の2つの難しいところを何度も復習していきますね。( ´∀` )
勉強時間合計:12h