[Unity]UnityとC#を学ぶ問題:004

4日続きました。

第一問

ゲーム空間中に配置した球体を無限にバウンドさせ続けるようにコンポーネントを配置してください。

仕様

  • ゲーム空間にはPlaneがあります。
  • Planeは地面として使用するため動いていはいけません。
  • 同様に、ゲーム空間にはSphereがあります。
  • 再生ボタンを押下するとPlaneは移動せず、Sphereが落下し、地面に触れるとバウンドして元の高さかそれ以上の高さまで跳ね上がります。
  • これらはコードによる生成、Unityのシーン上で作成、どちらのやりかたでもかまいません。

ヒント

  • 落下にはRigidbodyを使用します。
  • 跳ねさせるにはPhysicMaterialを使用します。
Ad

答え

跳ねるボールにする

  • UnityEditor上のProjectペイン上で右クリックし、Create -> Physic Material を選択します。
  • 作成されたPhysicMaterialのBouncinessを1以上に設定します。
  • Bounce Combine を Maximam にします。
  • このPhysicMaterialをSphere にアタッチされている Sphere Collider の項目に D&D します。

物理を利用した柔らかさや摩擦などなPhysicMaterialを使うと調整しやすいです。

移動しないオブジェクトを作る

  • SphereにアタッチしたRigidbodyの Constraints の項目にある Freeze Position のxとyのチェックを入れておきます。

この設定をすることで、Y軸上でしか移動しなくなります。

第二問

第一問で使用したキューブに仕様の通りのコンポーネントを追加してください。

仕様

  • 自身の最高高度(y座標)を保持します。
  • 最高高度を保持するプロパティは高度がこれまでよりも高くなった時だけ次の振る舞いをします。
    • コンソール上に高さの値を表示する。
  • Sphereの上昇時は色を赤く、下降時は色を青くします。

ヒント

  • 最高高度を保持するメンバはset時に判定を行うと効率的です。
  • 上昇下降は Rigidbody.velocity で取得できます。

答え

プロパティに最高値のみを保持させる

最高値だけを与えるようにするにはプロパティのsetterにif文を入れておくと楽です。

    float m_maxHeight;
    float maxHeight{
        get{
            return m_maxHeight;
        }
        set{
            if( m_maxHeight < value ){
                m_maxHeight = value;
                Debug.Log( "height is updated! :" + value );
            }
        }
    }
<br />    // update中にでも。
    this.maxHeight = sphere.transform.position.y;

上昇、下降時を判定する

velocity.yの値が 正か負かで判定をします。

    bool isFalling = rigidbody.velocity.y < 0;

これで色を変えるタイミングがわかります。

第三問

第一問で使用したSphereが地面に接触する都度、仕様のとおりの振る舞いをするようにしてください。

仕様

  • 地面に触れると色が変わる。
  • 色は赤、青、緑、自由、という四つで構成される。
  • 自由とは、毎フレーム違う色で表現される。

ヒント

  • 色を状態として捉え、Enumを自分で作成してみます。
  • 現在の状態に応じて色を変えるようにしてみましょう。

答え

コードと実際にどう見えるか確認できます。

BounceBall from s2kw on Vimeo.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です