Unityに関連する記事です

学習すること

<戻り値>の使い方
<関数の引数>の使い方 (数の引数 ⊆作クラスの引数
スクリプト内での<Add Component>の使い方
スクリプト内でコンポーネントの削除のやり方

 現在はスピードアップのアイテムに接触するとPlayerの移動速度が変化します。
ただし、時間切れなどの制限がないため、一度取るとずっと移動速度が変化したままになってしまいます。
 こちらを修正し、時間制限付きでスピードアップが発生するようにしていきます。

 色々な方法がありますが、あまりサイトの記事にない方法で実装をしていこうと思います。

 イメージとしては

1.スピードアップのアイテムに接触する
2.Playerゲームオブジェクトに「スピードアップ」というクラスをアタッチし、
  移動速度を変化させるとともに、スピードアップ状態をインスペクターから視認できる形で付与する。
3.一定時間後に「スピードアップ」のクラスを破棄すると同時に、移動速度を元に戻す。

 Playerの移動速度を変化させる(上げる、下げる、戻す)といった処理はすべて
PlayerクラスのChangeMoveSpeed関数にて行うようにします。


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


public class PlayerController : MonoBehaviour
{
    private float moveSpeed;

    // Start is called before the first frame update
    void Start()
    {
        moveSpeed = 0.05f;
    }

    // Update is called once per frame
    void Update()
    {    
        // 左矢印が押された時
        if(Input.GetKey(KeyCode.LeftArrow))
        {
                // 左に「3」動かす
                transform.Translate(-moveSpeed, 0, 0);                          
        }
        // 右矢印が押された時
        if(Input.GetKey(KeyCode.RightArrow))
        {
                // 右に「3」動かす
                transform.Translate(moveSpeed, 0, 0);                     
        }
    }

    /// <summary>
    /// 移動速度を変更する
    /// ItemSpeedクラスから呼び出される
    /// </summary>
    public void ChangeMoveSpeed(float newMoveSpeed) {
        moveSpeed = newMoveSpeed;
        Debug.Log(moveSpeed);
    }

    /* ここから追加 */

    /// <summary>
    /// 本来の移動速度の戻り値を使って返して渡す
    /// </summary>
    public float GetMoveSpeed() {
        return moveSpeed;
    }

    /* ここまで */
}


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

public class Condition_ChangeSpeed : MonoBehaviour
{
    [Header("このクラスがアタッチされた時のPlayerの移動速度")]
    public float changedSpeed;

    [Header("このクラスをアタッチしておく時間 = 効果時間")]
    public float conditionTime;

    private PlayerController playerController;

    private float normalMoveSpeed;  // 本来の移動速度
    private float timer;            // 効果時間計測用

    /// <summary>
    /// SpeedItemクラスで呼び出される
    /// </summary>
    public void Setup(float speed, float time)
    {
        // 受け取った引数を用意した変数へ代入する(引数の変数のスコープ範囲は、その関数内でしか使えない)
        changedSpeed = speed;
        conditionTime = time;

        // このクラスがアタッチされたゲームオブジェクトにPlayerControllerクラスがあるか確認して取得する
        if (TryGetComponent(out playerController)) {
            // 取得できたなら、元に戻す際の移動速度を記録しておく
            // 左辺 = 右辺 の処理により、戻り値を持つGetMoveSpeed関数を実行することで、値が代入される
            normalMoveSpeed = playerController.GetMoveSpeed();

            // 移動速度を変更する
            playerController.ChangeMoveSpeed(changedSpeed);
        } else {
            // 取得できなかったら、このクラスを破棄する
            Destroy(GetComponent<Condition_ChangeSpeed>());
        }
    }

    void Update() {
        // PlayerControllerクラスが代入されるまでは、Update処理をしない
        if (playerController == null) {
            return;
        }

        // タイマーを実行
        timer += Time.deltaTime;

        // タイマーの値が効果時間を超えたら
        if (timer > conditionTime) {
            // 移動速度を元の値に戻す
            playerController.ChangeMoveSpeed(normalMoveSpeed);

            // このクラスを破壊する
            Destroy(this);
        }
    }
}



using UnityEngine;

/// <summary>
/// Playerの移動速度を変更するクラス
/// アイテムにアタッチして使用する
/// </summary>
public class SpeedItem : MonoBehaviour
{
    [Header("Playerの移動速度の変更値")]
    public float speed;

    [Header("Playerの移動速度の変更値")]    // 追加
    public float conditionTime;             // 追加

    void Update() {
        if (transform.position.y < -5.0f) {
            // 画面外にアイテムが出たら破壊する
            Destroy(gameObject);
        }    
    }

    private void OnTriggerEnter2D(Collider2D col) {
        // 接触したゲームオブジェクトのタグが”Player”か確認する
        if (col.gameObject.tag == "Player") {

            /* いままでの処理をコメントアウト*/            

            // ”Player”であったなら、そのPlayerゲームオブジェクトが所持しているPlayerControllerクラスを取得を試みる
            //if (col.gameObject.TryGetComponent(out PlayerController playerController)) {
            //    // PlayerControllerクラスを取得できたなら、PlayerControllerクラスのChangeMoveSpeed関数を呼び出し、引数としてspeed変数を渡す
            //    playerController.ChangeMoveSpeed(speed);
            //}
            //Debug.Log(playerController);

            /* ここまでコメントアウト 以下を追加*/

            // すでにスピードアップしている状態なら、スピードアップは処理しない
            if (col.gameObject.GetComponent<Condition_ChangeSpeed>()) {
                return;
            }

            // スピードアップ状態でないなら、スピードアップ用クラスを新たにコンポーネントとしてアタッチする
            col.gameObject.AddComponent<Condition_ChangeSpeed>().Setup(speed, conditionTime);

            // ゲームオブジェクトにコンポーネントがアタッチされているか確認するためのDebug
            Debug.Log(col.gameObject.GetComponent<Condition_ChangeSpeed>());

            // このアイテムを破壊する
            Destroy(gameObject);
        }
    }
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます