【GW企画】7日間でUnity製のカジュアルゲームを作る【4日目】

←【3日目】

「GW10連休を活かしUnityでカジュアルゲームを作ってリリースする企画」の4日目

4日目の計画

★ゲームのメインシーンの完成
・生成ロジックの修正
・横回転のローテーションでターゲット定める点の実装
   (皿を動かす or フライパン側を動かす)
・ターゲットの軌跡想定を実装
・Gameの基本UIを実装

4日目にやったこと

生成ロジックの修正

if文の分岐が怪しいのかと思いif elseとかSwitch文あたりに書き換えしてみたけど変化無し。
生成スクリプトを1回だけ走らせるためのブール値のフラグ付けを行い、さらにPrefabから生成したCloneオブジェクトも当たり判定に加える処理をしたことで重複生成が改善された。

using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class Fly : MonoBehaviour
{
    // 物理剛体
    private Rigidbody physics = null;
    // 飛ばす間だけ回転させるためのフラグ
    private bool stay;
    // クリックしている時間のカウント
    private float GetMouseTime;
    // Generate用のブール値
    private bool GenerateFlag = false;
    // ゲームオブジェクト探す系
    GameObject Flypan = GameObject.Find("Flypan");
    GameObject Plate = GameObject.Find("Plate");
    GameObject Desk = GameObject.Find("Desk");
    GameObject Floor = GameObject.Find("Floor");
    // 初期化処理
    public void Awake()
    {
        this.physics = this.GetComponent();
    }
    // 毎フレームごとの処理
    public void Update()
    {
        //クリックを押した時の処理
        if (Input.GetMouseButtonDown(0))
        {
            //マウスをクリックしている時間の初期化
            GetMouseTime = 0;
        }
        //クリックを押してる間の処理
        if (Input.GetMouseButton(0))
        {            
            // タイムを加算する
            GetMouseTime += Time.deltaTime;
        }
        //クリックを離した時の処理
        if (Input.GetMouseButtonUp(0))
        {
            Debug.Log("ボタン押してる時間" + GetMouseTime.ToString("F2"));
            //ジャンプの処理(高さと距離は2:1ぐらいが調子良い?)
            this.Flip(new Vector3(0f, GetMouseTime*8f, GetMouseTime*4f));
        }
        if (stay == false)
        {
            transform.Rotate(new Vector3(5, 0, 0));
        }
    }
    // ★当たり判定周りの処理
    // オブジェクトが衝突したときの処理(空中にいるかいないかの判断)
    private void OnCollisionEnter(Collision collision)
    {
        // パンケーキが回転するためのフラグ
        stay = true;
        if (collision.gameObject.name == "Flypan")
        {
            Debug.Log("フライパンにあたってます");
        }
        else if (collision.gameObject.name == "Plate")
        {
            Debug.Log("プレートにあたってます");
            Generate();
        }
        else if (collision.gameObject.name == "Pancake")
        {
            Debug.Log("パンケーキにあたってます");
            Generate();
        }
        else if (collision.gameObject.name == "Pancake(Clone)")
        {
            Debug.Log("パンケーキ(Clone)にあたってます");
            Generate();
        }
        else if (collision.gameObject.name == "Desk")
        {
            Debug.Log("机にあたってます");
            Generate();
            Destroy(this.gameObject);
        }
        else if (collision.gameObject.name == "Floor")
        {
            Debug.Log("床にあたってます");
            Generate();
            Destroy(this.gameObject);
        }
    }
    // あたり判定が離れたときの処理
    private void OnCollisionExit(Collision collision)
    {
        // パンケーキが回転するためのフラグ
        stay = false;
        if (collision.gameObject.name == "Flypan")
        {
            Debug.Log("フライパンから離れました");
        }
    }
    //オブジェクトが触れている間の処理
    void OnCollisionStay(Collision collision)
    {
    }
    // ★呼び出しファンクション
    // ボールをはじく
    public void Flip(Vector3 force)
    {
        // 瞬間的に力を加えてはじく
        this.physics.AddForce(force, ForceMode.Impulse);
    }
    // パンの生成
    public void Generate()
    {
        if(GenerateFlag == false)
        {
            GenerateFlag = true;
            GameObject nextPancake = Instantiate(Resources.Load("Pancake")) as  GameObject;
            this.GetComponent().enabled = false;
        }
        
    }
}

お皿の左右移動の演出

ただタップの長さだけで飛ばすのも単調なので、お皿が左右に動くように調整。・参考記事)Unity入門講座[12]動く床を作ろう
https://mono-pro.net/archives/3525

パンケーキをお皿に固定化する処理の追加

お皿を無事動かせたタイミングで問題発生。

お皿に接触させた時点でパンケーキが停止してしまい、皿と一緒に左右に座標が引っ張られない実装になっていた。

これについてはオブジェクトの親子関係をコードに追記することで対応。
お皿を親オブジェクト / パンケーキを子オブジェクトとし、お皿に接触したタイミングで動作するように記載。参考記事)オブジェクトの親子関係のまとめ – Unity

親子関係の実装は早いタイミングで見つけていたのだけど、うまく動作せずに他の可能性を探そうと無駄な時間を使ってしまった。
親宣言を入れるのを忘れてたために動作していなかったっぽい。

    //親子用
    private GameObject _parent;
~中略~
            //親子関係
            _parent = transform.root.gameObject;
            this.transform.parent = GameObject.Find("Plate").transform;

パンケーキの弾道/軌道のシミュレーション

アングリーバードみたいな感じでパンケーキの飛ぶ着地点のシミュレーションを出せるようにする実装をしたかった。

弾道/軌道シミュレーションなどで検索してると複数参考コードがみつかったものの、うまく導入できなかった。
このため半透明化したパンケーキをタップしている時間だけ進ませるようにして擬似的な着弾地点の参考にさせた。
※さらにフライパンからパンケーキが離れたタイミングでマーカーが削除されるように追記

        //クリックを押してる間の処理
        if (Input.GetMouseButton(0))
        {
            // タイムを加算する
            GetMouseTime += Time.deltaTime;
            // マーカーを移動させる
            GameObject Marker = GameObject.Find("Marker(Clone)");
            Marker.gameObject.transform.Translate(0f, 0f,  GetMouseTime*GetMouseTime/3f);
        }
~中略~
    // あたり判定が離れたときの処理
    private void OnCollisionExit(Collision collision)
    {
        // パンケーキが回転するためのフラグ
        stay = false;
        if (collision.gameObject.name == "Flypan")
        {
            //Debug.Log("フライパンから離れました");
            GameObject Marker = GameObject.Find("Marker(Clone)");
            Destroy(Marker.gameObject);
        }
    }

4日目の振り返り

最後にオブジェクトの飾り付けをしたことでかなりそれっぽくなった。
ただ4日目中にUI実装まで終わらせて調整に入りたかったものの、間に合わず…。→【GW企画】7日間でUnity製のカジュアルゲームを作る【5日目】

タイトルとURLをコピーしました