初めてゲームと呼べるんじゃないかというものを作った
久しぶりに書く。
時間があったら動画にもして記録しておきたい。
あと多分良い言い回しがあったりしたら、ちょくちょく更新する。
↑これを作った。
昔描いた漫画のキャラ、「ウロノソラ」が主役の
アイテムの取得組み合わせによって、エンディングの会話が変化するゲーム。
一エンドへのプレイ推定時間30秒から1分
セーブ不可、メニュー出ない
この程度のゲームなら、スクリプト書かないでウディタとか、
ツクールとか使ったほうが、楽しい(個人の感想)
---------------------使用素材
BGM
魔王魂 https://maou.audio/
効果音
On-Jin ~音人~ https://on-jin.com/
効果音ラボ https://soundeffect-lab.info/
OtoLogic https://otologic.jp
背景
「学校の背景が全てそろう01」完全フリー素材集!! 背景素材屋さん https://www.dlsite.com/home/work/=/product_id/RJ277874.html
フォント
M+FONTS https://mplus-fonts.osdn.jp/
アセット
Fungus https://fungusgames.com/
ここだけ押さえておけば似たものは作れるっていう、作り方メモ
なおいろんなウェブページ見て知った知識のため、全部間違ってるかもしれない。
未来の自分混乱したらごめん。
フラグに関して
★キャラに、「CapsuleCollider2D」をセット
・EditColliderでキャラクター前側だけに付けた
(RigidBody2Dって勝手につくのか忘れたけど
・BodyType:Dynamic
・Constration FreezeRotation:Z にチェック(回転しなくなる))
★アイテムに、「CiecleCollider2D」をセット
・isTriggerにチェック
(RigidBody2Dって勝手につくのか忘れたけど
・BodyType:Kinematic)
★フラグ管理スクリプトを作る
public class GAMETotal : MonoBehaviour
{
//エンディングに行くためのフラグ
public bool flag1 = false;//宿題
public bool flag2 = false;//ゲーム機
public bool flag3 = false;//体操着
}
・これをオブジェクトを作ってアタッチしておく(TotalConっていうのを作った)
★キャラスクリプトを作る
・AddComponentでキャラクターに新しいスクリプトをくっつける
・フラグ管理スクリプトをキャラスクリプトで見れるようにする
public class CharaController : MonoBehaviour
{
GAMETotal script;
private void Start(){
TotalCon = GameObject.Find("FlagController");
script = TotalCon.GetComponent<GAMETotal>();
}
他のオブジェクトに付いてるスクリプトを見れるようにした
・OnTriggerEnter2Dでアイテムを取得できる範囲に入っているか見る
例:宿題
private void OnTriggerEnter2D(Collider2D other) {
if (other.gameObject.name == "item_1")
{ Item1 = true; }
}
・エンターキーでアイテムを拾う
例:宿題
if (Input.GetKeyDown(KeyCode.Return))
{if (Item1 == true)
{
GameObject item1 = GameObject.Find("item_1");
Destroy(item1);
script.flag1 = true; }
}
}
・OnTriggerExit2Dでアイテムを拾えない範囲にキャラが出たら拾えないようにする
例:宿題
private void OnTriggerExit2D(Collider2D other) {
if (other.gameObject.name == "item_1")
{
Item1 = false;
}
}
item1:宿題拾えますっていうのをキャラクターに伝えるやつ
script.flag1:立ちました!宿題拾って持ってるぜ!ってやつ
OnTriggerEnter2D:ずっとキャラに、拾える範囲に立ってる間、
「拾えます拾えます拾えます拾えます拾えます……」って言い続ける
OnTriggerExit2D:拾える範囲から外れた瞬間、
「外れました!!!!!」って一言言って終わり
★持ってるフラグをFungusのFlowchartに伝える
※今回のはシーンをまたいで伝えたりしているので、これがあればたぶん行けるっていうのだけ…
・FungusのFlowchartでBlockをつくり、
BlockのExecuteOnEventをMessageReceivedにする。
Messageにスクリプトに書き込む文字を書く。
・オブジェクトを作ってフラグをFungusに伝えるためのスクリプトを付ける。
上のほうに書いてあるの同様、他のスクリプトのフラグを見てエンディングを決めてる。
例:
if (script.flag1 == true)
{
if (script.flag2 == true)
{
if (script.flag3 == true)
{
flowchart.SendFungusMessage("End8");//全部持ってる
}
else {
flowchart.SendFungusMessage("End6");//体操着持ってる
}
}
}
〇Fungus関係のスクリプト
public Fungus.Flowchart flowchart;
コイツでFungusのこのフローチャート使うぜって言ってる
Class直下に置いてる
flowchart.SendFungusMessage("End1");//宿題持ってる
Messageの欄にEnd1って書いてあるのを呼び出しますーって言ってる
フラグをシーンまたいで使う方法
★タイトル前に読み込むシーンを作り、そこにフラグ管理スクリプトを置いておく
・タイトル前に読み込むシーンに「DontDestroyOnLoad(フラグの入ったオブジェクト);」
を書き込んだスクリプトをアタッチしたオブジェクトを用意。
シーンをまたいでも存在するオブジェクトができる。
このスクリプトにまとめてフラグを書き込んだ。
キャラの移動に関して
★歩いていいかどうかフラグで判断して、歩いている間はアニメーションを発動
[SerializeField] float right = 0.1f;
void FixedUpdate()
{
if (walk == true)
{
if (Input.GetKey(KeyCode.RightArrow))
{
transform.localScale = new Vector2(-1, 1);
animator.SetBool("Walk", true);
transform.Translate(right, 0f, 0f);
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
animator.SetBool("Walk", true);
transform.localScale = new Vector2(1, 1);
transform.Translate(-right, 0f, 0f);
}
else
{
animator.SetBool("Walk", false);
}
}
}
FixedUpdate:
Updateはずっと見てるのに対してこちらは一定時間ごとに呼び出し、らしい。
Updateで歩かせたらアニメーションがカクつくからこっちにしたはず。
メニューを開く、とか、ものを取る、みたいな一瞬だけのものには使えないので注意。
Rigidbodyがうまく扱えない人間なので、こんな感じで書いてる。
エンディングでFungusで背景を変える方法
★背景を変えるスクリプトを用意してBlock内で変更
・背景用のCanvasを用意して、その中にimageを背景分用意。
・Inspectorの名前の左横のチェックを外す。
・スクリプトに背景分のメソッドを作成
例:校舎内背景
public void Change_Naka()
{
image_soto.SetActive(false);
image_heya.SetActive(false);
image_naka.SetActive(true);
}
・Block内で+から「Scripting/CallMethod」を追加
スクリプトがアタッチされたオブジェクトを「TargetObject」に入れる。
MethodNameに呼び出すメソッドを入れる(上のだったら「Change_Naka」)。
多分ここら辺だけ書いておけば、未来の自分は迷わない気がする…
アルセウスやりながら書いてたので、後半何メモしたかったか忘れた。
とりあえず、追加したいものができたら追記書く。
といっても、見返してたら難しいことやってないんだろうなって感じだったから…
頑張ろう自分。
キャラ図鑑作りてぇ~(n回目)
コメント
コメントを投稿