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 の値をセットする
}
}
}
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;
}
}