20201122のUnityに関する記事は2件です。

【Unity】ランダムで沢山の武器の中から三つを選べるシステムを実装してみた

この記事は?

先日stgゲームを作っている際に、タイトル通りのことを作ってみようと思ったのですが、
自分にとって難しかったので実装までの道のりを備忘録的に書いてみました。

実装までの道のり

まず、問題の切り分けをしました。ランダムで沢山の武器の中から三つを選ぶシステムを作るためには、
1 沢山の武器を作り、配列の中に入れる。
2 乱数を使って三つの「被らない」乱数を添え字として使う。
3 プレイヤーが選んだことを検知して選んだ武器を渡す。
この3つがあれば実装できそうなので、順に実装していきました。

1 沢山の武器を作り、配列の中に入れる。

あとから武器を追加する可能性があるので、静的配列ではなく動的配列を作り、順次武器を作ってその中に入れていきます。

2 乱数を使って三つの「被らない」乱数を添え字として使う。

これが正直一番大変でした。ただwhileを使って被らないような内容を作るだけなのですが、
for文やらif文やらが混雑してなんの文がなにをしているかがわからなくなってしまい、
解読に時間がかかったり、Unityがフリーズしたりと。
切り分けて一つずつ問題を解決していけば難しくないことに気が付きました。

3 プレイヤーが選んだことを検知して選んだ武器を渡す。

これはゲームを作ったことのある人なら誰もが覚えのあるOnButtonClickメソッドで、
選んだ武器の情報を取得すればよさそうです。

最後に

Listとかを使うときはAddやらRemoveやらを使わなければならないみたいなので使うのを尻込みしていましたが、
色々検索してみたら意外にもなんとかなったのでGoogle先生に感謝しながらコード書いていきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityメモ 移動する床とプレイヤー 親子関係

プレイヤーのスクリプト
レイでの判定分け レイヤー使用

void OnCollisionStay(Collision col)
{

    if (Physics.Linecast(m_charaRay.position, m_charaRay.position + Vector3.down, LayerMask.GetMask("Ground")))
    {
        m_isGroundCollider = true;
    }
    else if(Physics.Linecast(m_charaRay.position, m_charaRay.position + Vector3.down,LayerMask.GetMask("MoveGround")))
    {
        m_isGroundCollider = true;
        gameObject.transform.SetParent(col.transform);//親子関係を設定
    }
    else
    {
        m_isGroundCollider = false;
        gameObject.transform.SetParent(null);//親子関係を外す
    }


}

注意点
プレイヤーでの移動方法で挙動が変わってくるので現在は
transform.positionを操作している

    Vector3 moveDir = Vector3.zero;

    if (Input.GetKey(KeyCode.W))
    {
        moveDir += forwardDir;
    }
    if (Input.GetKey(KeyCode.S))
    {
        moveDir -= forwardDir;
    }
    if (Input.GetKey(KeyCode.D))
    {
        moveDir.z += m_moveSpeed;
    }
    if (Input.GetKey(KeyCode.A))
    {
        moveDir.z -= m_moveSpeed;
    }

    //トランスフォームで移動させたら移動する床でも子オブジェクト状態でも移動できる
    if (moveDir.sqrMagnitude > Mathf.Epsilon)
    {

        transform.position += moveDir;
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む