3週目の質問と回答 - dsuz/2019-1st-term-unity-game-development GitHub Wiki

定期的にパドルが縮む機能をつけたい

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// パドルを制御するクラス
/// パドルのオブジェクトに追加して使う
/// </summary>
[RequireComponent(typeof(Rigidbody2D))]
public class PaddleController : MonoBehaviour
{
    /// <summary>パドルの移動速度</summary>
    [SerializeField] float m_speed = 5f;
    Rigidbody2D m_rb2d;
    /// <summary>パドルのサイズ変更が起きる間隔(秒)</summary>
    [SerializeField] float m_changeSizeInterval = 3f;
    /// <summary>パドルのサイズ変更率</summary>
    [SerializeField] float m_changeSizeRatio = 0.9f;
    /// <summary>パドルのサイズ変更間隔を測るためのタイマー(秒)</summary>
    float m_timer = 0f;

    void Start()
    {
        m_rb2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 水平方向の入力を検出する
        float h = Input.GetAxisRaw("Horizontal");
        // 入力に応じてパドルを水平方向に動かす
        m_rb2d.velocity = h * Vector2.right * m_speed;

        // 定期的にパドルのサイズが変わる処理
        m_timer += Time.deltaTime;  // フレーム間の時間差を積算することで、何秒経過したか測る(unity time deltatime タイマー でググりましょう)
        if (m_timer > m_changeSizeInterval) // サイズ変更間隔の秒数が経過したら
        {
            m_timer = 0f;   // タイマーをリセットする
            Vector3 afterScale = new Vector3(this.transform.localScale.x * m_changeSizeRatio, this.transform.localScale.y, this.transform.localScale.z);    // サイズ変更後の Scale の値を計算して
            this.transform.localScale = afterScale; // Scale の値をセットする
        }
    }
}

ボールが2回ぶつかったら壊れるようにしたい

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// ターゲットブロック(ボールが当たったら壊れるブロック)を制御する
/// ターゲットブロックの GameObject に追加して使う
/// </summary>
public class TargetBlockController : MonoBehaviour
{
    /// <summary>この回数ボールがぶつかったらブロックは消える</summary>
    [SerializeField] int m_life = 2;

    void Start()
    {

    }

    void Update()
    {

    }

    /// <summary>
    /// Collider に衝突判定があった時に呼ばれる
    /// </summary>
    /// <param name="collision">衝突の情報</param>
    void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log("Enter OnCollisionEnter2D."); // 関数が呼び出されたら Console にログを出力する

        // 衝突相手がボールだったら
        if (collision.gameObject.tag == "BallTag")
        {
            // ライフを減らす
            m_life -= 1;
            // ライフが 0 になったらブロックを消す
            if (m_life < 1)
            {
                Destroy(this.gameObject);
            }
        }
    }

    /// <summary>
    /// 「トリガーモードの」Collider に衝突判定があった時に呼ばれる
    /// </summary>
    /// <param name="collision">衝突の情報</param>
    void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("Enter OnTriggerEnter2D."); // 関数が呼び出されたら Console にログを出力する

        // 衝突相手がボールだったら自分自身を破棄する
        if (collision.gameObject.tag == "BallTag")
        {
            Destroy(this.gameObject);
        }
    }
}

ブロックにボールがぶつかったらブロックの色を変えたい

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// ターゲットブロック(ボールが当たったら壊れるブロック)を制御する
/// ターゲットブロックの GameObject に追加して使う
/// </summary>
public class TargetBlockController : MonoBehaviour
{
    /// <summary>この回数ボールがぶつかったらブロックは消える</summary>
    [SerializeField] int m_life = 2;
    /// <summary>ボールがぶつかったらこの色に変わる</summary>
    [SerializeField] Color m_damageColor = Color.red;

    void Start()
    {

    }

    void Update()
    {

    }

    /// <summary>
    /// Collider に衝突判定があった時に呼ばれる
    /// </summary>
    /// <param name="collision">衝突の情報</param>
    void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log("Enter OnCollisionEnter2D."); // 関数が呼び出されたら Console にログを出力する

        // 衝突相手がボールだったら
        if (collision.gameObject.tag == "BallTag")
        {
            // 色を変える
            GetComponent<SpriteRenderer>().color = m_damageColor;

            // ライフを減らす
            m_life -= 1;
            // ライフが 0 になったらブロックを消す
            if (m_life < 1)
            {
                Destroy(this.gameObject);
            }
        }
    }

    /// <summary>
    /// 「トリガーモードの」Collider に衝突判定があった時に呼ばれる
    /// </summary>
    /// <param name="collision">衝突の情報</param>
    void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("Enter OnTriggerEnter2D."); // 関数が呼び出されたら Console にログを出力する

        // 衝突相手がボールだったら自分自身を破棄する
        if (collision.gameObject.tag == "BallTag")
        {
            Destroy(this.gameObject);
        }
    }
}

パドルを水平方向だけではなく、垂直方向にも動かしたい

垂直方向に動かすには、パドルの GameObject に追加した "Rigidbody 2D" コンポーネントの設定 "Constraints - Y" のチェックを外すこと。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// パドルを制御するクラス
/// パドルのオブジェクトに追加して使う
/// </summary>
[RequireComponent(typeof(Rigidbody2D))]
public class PaddleController : MonoBehaviour
{
    /// <summary>パドルの移動速度</summary>
    [SerializeField] float m_speed = 5f;
    Rigidbody2D m_rb2d;

    void Start()
    {
        m_rb2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 水平方向の入力を検出する
        float h = Input.GetAxisRaw("Horizontal");

        // 垂直方向の入力を検出する
        float v = Input.GetAxisRaw("Vertical");
        
        // 入力に応じてパドルを動かす
        m_rb2d.velocity = (h * Vector2.right + v * Vector2.up) * m_speed;
    }
}
⚠️ **GitHub.com Fallback** ⚠️