うまげーむのゲームブログ

ゲームの情報を主に投稿します。

【VALORANT】アイスボックスのソーヴァを極めよう!攻め・守りで使えるリコンボルト・ショックダーツの定点まとめ【ダブルショックダーツ】

はじめに

どうも。

今回はアプデ後のアイスボックスにおける、ソーヴァのリコンボルト・ショックボルトの定点をまとめました。

例によって、リコン・ショックダーツのチャージ数は上記にように表します。

リコンボルト(攻め)

Aサイト内

Aサイト内へのリコンは、このあたりにリコンを撃つと良い感じになります。

サーバーの奥の壁です。

ミッド

ここの角に立って、

赤く囲っている電灯の少し左にエイムして、フルチャージ1バウンスで撃ちます。

ここに刺さります。

Bグリーン1(開幕時)

ここの角に立って、

赤く囲ってある角に、

1チャージの所をあわせてエイムして、

視点を動かさずに購入フェーズのバリアの角に移動します。

ラウンド開始後、奥の緑のコンテナ(上スクショで視点を合わせているやつ)が見えた瞬間にフルチャージ1バウンスで撃ちます。

成功するとここに刺さります。少し面倒くさいですが、開幕後すぐに撃てる手前のリコンとしては優秀です。

B グリーン2

上記のBグリーンのリコンの別バージョンです。これはラウンドのどの場面でも使えます。

ここの壁沿いに立って、

壁の黄色と黒のやつに注目して、赤線の延長線の交点に向かってエイムしてフルチャージ1バウンスで撃ちます。

ここに刺さります。

Bイエロー

ここのドアの前に立って、

赤い矢印で示している数字の「2」の少し左に向かって、フルチャージ0バウンスで撃ちます。

ここに刺さります。

リコンボルト(守り)

A 開幕時

ここの角に立って、

赤く囲っている少し白くなっている所に、

チャージの枠の左上の角をあわせてエイムして、フルチャージ1バウンスで撃ちます。

ここに刺さります。

ミッド

ここの角に立って、(ある程度適当で良いです)

ここの電灯に向かってエイムしてフルチャージ1バウンスで撃ちます。

ここに刺さります。

A→B グリーン

ここの角に立って、

このように、背景の雲?の色が変わっているところにチャージの枠の左上の角を合わせてフルチャージ1バウンスで撃ちます。

ここに刺さります。

ショックダーツ(解除阻止)

スパイク設置後に、解除しようとした敵を倒す用のショックダーツまとめです。

A(ロープ設置)

ここに立って、

黒い線の中央に向かってエイムして、1チャージ1バウンスで撃ちます。

ロープの場所に着弾します。

B

ここの角に立って、

背景の黒い部分(山?)の先端にエイムして、1チャージ1バウンスで撃ちます。

ここに着弾します。

ダブルショックダーツ(おまけ)

A

ここに立って、

「チャージ」の「ジ」の文字の右上が、緑線のところの角の真下にある状態で、チャージのバーの右下の頂点が、青線と重なるようにエイムして、2チャージ2バウンスで撃ち、

赤く囲ってあるところに0チャージ0バウンスで撃ちます。

ここに着弾します。2発目は適当でOKです。

Bメイン1

ここの角に立って、

赤く囲ってある星に向かってエイムして、1チャージ0バウンスで撃ち、

そのまま視点をバウンスという文字がオレンジのコンテナと重なるまで下に下げて、0チャージ0バウンスで撃ちます。

ここに着弾します。(画像は過去の記事から持ってきたものですが、現在のバージョンでも使えます)

さいごに

今回は以上です。

他のマップ・他のエージェントの定点まとめも投稿してますので良ければご覧ください。

www.umagame.info

【パッチ8.0対応】アイスボックスのヴァイパーを極めよう!攻め・守りで使える空爆・壁・スモークの定点まとめ【VALORANT】

はじめに

どうも。

VALORANTのエピソード8が始まると同時に、マッププールにアイスボックスが戻ってきました。

ということで今回は、パッチ8.0の変更後のアイスボックスにおけるヴァイパーの壁・スモーク・空爆の定点をまとめました。

参考になれば幸いです。

壁・スモークのセットアップ

A攻め(壁・スモーク)

ここの壁の前に立って、

赤く囲ってある角に向かってエイムして、走りながら投げます。(Wキーを押した0.5秒後ぐらいに投げる)

ここにスモークを置くことが出来ます。

壁はスクリーン側からの斜線を切れれば何でも良いです。上は一例です。

こんな感じです。

ミッド攻め(重要!!!)

ミッドを攻める際に使えるスモークです。攻めでとても重要なのでこれだけはなっておいたほうが良いです。(まあその分有名なので知っている方も多いと思います)

まず、ここの地面の矢印の先の上に立って、

赤く囲ってある角に向かって投げます。

これでミッドからの斜線を切ることができるので、ミッドの進行が楽になります。(ミッドを攻めない場合でも、敵が得られる情報を減らすことができるので得です)

B攻め(壁)

赤く囲ってある線の前にたって、

青線で縁取っている壁の模様を参考にして、赤線の当たりにエイムして壁を展開します。

こんな感じになります。わかりにくい場合はマップを参考にしてやっても良いです。

A守り(壁)

購入フェーズ時にここの角に立って、

このように壁を展開します。(マップまたは視点を参考にしてください)

このように、キング上にも壁が乗るようにしましょう。

B守り(壁・スモーク)

ここの光ってるやつの前に立って、

このように、緑のコンテナの右端に合わせて壁を展開します。

このようになります。

次にスモークです。ここの角に立って、

白いコンテナの「2」と「4」の間にエイムして、ジャンプしながら右クリックで投げます。

このようになります。これはイエロー付近で守る用なので先程の壁をあわせて使う必要はありません。

Aに壁を使って、Bはこのスモークで守るというやり方がおすすめです。

また、このようなスモークもスネークバイトと合わせて設置阻止に使えるため強いです。

解除阻止空爆(スネークバイト)

スパイク解除阻止用の空爆まとめです。スネークバイト単体では敵のHPを削り切ることはできないので、ポイズンクラウドと合わせるか味方に敵を倒してもらう必要があります。

ちなみに、この記事内での「デフォルト設置」の意味はそのサイトで一番よく使われる設置位置のことです。

Aデフォルト設置(スポーン側から)

ここの壁の前に立って、

赤く囲ってある角に向かってエイムして投げます。

ここに着弾します。

Aデフォルト設置(ベルトから)

ここの箱の上の角に立って、

このようにエイムして投げます。

ここに着弾します。

Aロープ設置

先程と同じ場所に立って、

今度は赤く囲ってある所に向かって投げます。

ロープしたの設置位置に着弾します。

Aロープ上設置

ここの角に立って、

このようにエイムして投げます。赤線の上に重なるようにしてください。

ここに着弾します。ソロランクではこの設置位置はあまり見ない気がしますが、フルパランクやプレミアの際はそれなりに使う機会があると思います。

Bデフォルト設置1

この赤線の前に立って、

上画像のように、UIの白線の左端を背景のキングダムのロゴの角に合わせて投げます。

ここに着弾します。

Bデフォルト設置2

ここの壁の前に立って、

赤く囲ってある角に向かってエイムして投げます。

ここに着弾します。

設置阻止空爆(スネークバイト)

守り側で、設置を阻止するためのスネークバイトの定点も少し紹介します。

Aデフォルトプラント1

ここの壁の前に立って、

赤線(天井の線)と青線が交わるところにエイムして投げます。

ここに着弾します。

Aデフォルトプラント2

ここのフェンスの横に立って、

上の画像のようにエイムして(かなり適当で良いです)、前に進みながら投げます。

このあたりに着弾します。

A攻めで使えるウルトの定点(おまけ)

最後に、A攻めで使える(かもしれない)ウルトを紹介します。

デフォルト位置に設置後ここの角に立って、

このようにエイムしてウルトを展開します。

アタック側に移動し、ここの壁の前に立って

この角にエイムしてジャンプと同時に投げます。

ここに着弾します。味方がちゃんとカバーしてくれればラウンド勝利につながるかもしれません。

さいごに

今回は以上となります。

↓他にも色々なエージェントの定点を紹介しています↓

www.umagame.info

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #8 パーティクル・コントローラー対応・エクスポート

はじめに

どうも。

実はこのUnity2Dアクションゲーム制作シリーズは今回で終了です。Unity関連の記事についての今後の予定はこの記事の最後に書いておきます。

今回はUnityのパーティクルシステム、クリア判定の作成、コントローラー操作への対応、ゲームのエクスポートをやります。

前回:

www.umagame.info

パーティクルの追加

マテリアルの追加

まず、第六回で追加した破壊可能ブロックの破壊時のエフェクトを追加します。

エフェクト用のスプライトを追加します。いつも通りテクスチャの設定を行います。(単位毎のピクセル数、フィルターモード、圧縮を変更)

マテリアル用のフォルダを作成します。パーティクルに画像を使用する場合、画像ファイルのままでは使えずマテリアルというのを作らないといけません。

Materialsフォルダ内で右クリック→作成→「マテリアル」をクリックして、新しくマテリアルを作成します。

名前は長いですがBricksParticle1Materialにします。(第六回で破壊可能ブロックを二種類作ったので、1と2に分けます)

作ったマテリアルのインスペクター上部の「Shader」を、上画像のように「Alpha Blended」に設定します。(Legacy Shaders→Particles→Alpha Blended)

その後、「Particle Texture」に用意した画像ファイルを設定します。ちなみに今回は上画像右下に表示されている4x4の画像を用意しました。

「Tint Color」を上のように設定します。V(明度)を75ぐらいにすると元画像と同じ明るさになります。

同様の手順で、BreakableBricks2用のマテリアルも用意します。

パーティクルシステムの作成

パーティクルを作ります。

ヒエラルキーで右クリック→「エフェクト」→「パーティクルシステム」をクリックします。名前はBricksParticle1としました。

これがパーティクルシステムの設定画面(インスペクター)です。初めて触る方は設定項目が多すぎて何がなんだか...と感じるかもしれませんが意外と簡単です。

ですが、それぞれを解説するのは時間がかかるので割愛します。

とりあえず、今回は以下のように設定しました。

  • ループ→チェックなし
  • 開始時の速度→9~7のうちランダム(設定方法は後ほど説明)
  • 開始時のサイズ→0.2
  • 重力ソース→2D 物理演算
  • 重力モディファイア→3
  • ゲーム開始時に再生→チェックなし

「開始時の速度」のところは、入力欄の右にある三角をクリックして「2つの値間でランダム」をクリックすればOKです。

「放出」タブ:

  • 時間ごとの率→0
  • +ボタンをクリックして数を12に設定

「形状」タブ:

  • 角度→15
  • 半径→0.5

そして、「レンダー」タブの「マテリアル」に先程作ったマテリアルを適用します。

これでパーティクルは完成です。

プレハブの作成・スクリプトの編集

作成したパーティクルを、プレハブとして保存します。第六回(多分)で作ったPrefabsフォルダにBricksParticle1をドラッグアンドドロップします。

同様に、茶色レンガのパーティクル(BricksParticle2)も作ってプレハブにします。(コピーしてマテリアルを変えるだけです)

プレハブを作ったら、シーン内に存在するパーティクルは削除してもらって構いません。

第六回では破壊可能ブロックの判定としてタグを使っていましたが、それだけだとレンガの色の判別が出来ないので仕方なくスクリプトを使います。

計画性のなさが露呈してしまいました。

スクリプトは以下のようにします。

public class BreakableBricks : MonoBehaviour
{
    public int ID;
}

public int変数のIDを持っているだけです。タグとほとんど変わらないです。

BreakableBricks1と2のタグを「Untagged」(タグ無し)に設定します。このタグはもう使わないので、削除してもらって構いません。

そして、BreakableBricks1・2にこのスクリプトを適用してIDを設定します。

その後、Player.cs(プレイヤーのスクリプト)を以下のように編集します。

public class Player : MonoBehaviour
{
    public ParticleSystem BrickParticle1;
    public ParticleSystem BrickParticle2;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GameObject obj = collision.gameObject;

        //Breakable
        BoxCollider2D c = GetComponent<BoxCollider2D>();
        if (obj.GetComponent<BreakableBricks>() != null && rb.velocity.y == 0 && //タグではなくBreakableBricksスクリプトで判定するように
            obj.transform.position.y - obj.GetComponent<Collider2D>().bounds.size.y / 2 >= this.transform.position.y)
        {
            GameObject.Destroy(collision.gameObject);
            BreakSE.Play();
            if (obj.GetComponent<BreakableBricks>().ID == 1) //IDによってパーティクルを変える
            {
                Instantiate(BrickParticle1, obj.transform.position, Quaternion.identity).GetComponent<ParticleSystem>().Play(); //パーティクルを生成+再生
            }
            else if(obj.GetComponent<BreakableBricks>().ID == 2)
            {
                Instantiate(BrickParticle2, obj.transform.position, Quaternion.identity).GetComponent<ParticleSystem>().Play();
            }
        }
    }
}

コメントをつけたところに変更を施しています。

タグを使って衝突先のオブジェクトがBreakableBricksかどうかを判定していた所を、スクリプトによって判定を行うようにして、

そのIDによって生成するパーティクルを変えるようにしてあります。生成はGameObject.Instatiateを使っています。

Playerオブジェクトのインスペクターから、パーティクルのオブジェクトを設定します。

これで、ブロックの色に対応したパーティクルが出るようになりました。

ステージクリア判定の作成

旗のオブジェクトの作成

次に、ゴール(クリア判定)を作ります。

旗を追加して、旗に触れるとクリアになるようにします。旗のテクスチャをインポートして設定をします。

右クリック→2D オブジェクト→スプライト→正方形で新しくオブジェクトを作成します。

名前はFragにします。

インスペクターから「Sprite Renderer」の「スプライト」に画像ファイルを設定します。

「Box Collider 2D」を追加して、「コライダーの編集」で当たり判定を設定して「トリガーにする」にチェックを入れます。

スクリプト内での旗の判別のためにタグを追加します。タグ→タグを追加をクリック。

新しく「Frag」という名前のタグを追加して、Fragオブジェクトに適用します。

スクリプトの編集

Player.csを編集します。

//Player.cs
public class Player : MonoBehaviour
{

    public TextMeshProUGUI GameoverText;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GameObject obj = collision.gameObject;

        //InstaDeath
        if (obj.CompareTag("InstaDeath"))
        {
            GameoverPanel.SetActive(true);
            GameoverText.text = "Game Over!"; //テキスト変更
            Time.timeScale = 0;
        }
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        GameObject obj = collision.gameObject;

        //Frag
        if (obj.CompareTag("Frag"))
        {
            GameoverPanel.SetActive(true);
            GameoverText.text = "Stage Completed!"; //テキスト変更
            Time.timeScale = 0;
        }
    }
}

OnTriggerEnter2Dに旗に触れたときの処理を追加しています。

クリアしたときに表示される画面は、第五回で追加したゲームオーバー画面(GameoverPanel)を流用しています。

そのため、GameoverPanel内のテキスト(GameoverText)の文字列をデス時とクリア時で変更するようにしています。

プレイヤーのインスペクターから、テキストのオブジェクトを設定します。

これで、旗に触れるとこのようにクリア画面が表示されるようになりました。

コントローラー操作への対応

エクスポートする前に、コントローラー(ゲームパッド)でゲームをプレイできるようにします。

編集→プロジェクト設定から、

入力マネージャーを開いて、Dash・Escape・Jumpの「正方向ボタン(副)」にそれぞれ対応させたいコントローラーのボタンの名前(「joystick button #」、#に数字)を入力します。

どの数字がどのボタンに対応しているかは、調べればいくつか出てきます。

https://discussions.unity.com/t/xbox-one-controller-mapping-solved/187077 より

これは一例で、Xboxのコントローラーの場合です。

この設定で、ダッシュ・ポーズ画面の表示・ジャンプをコントローラーのボタンで行えるようになりました。

その後キーボードでの操作に使っていた軸(第三回参照)とは違う軸として、新しく「Horizontal」という軸を用意してこのように設定します。

「無効」という項目はデッドゾーンです。小さくしすぎるとコントローラーを触ってなくても動くようになってしまいます。

感度は好きなようにしてもらって構いません。(今回の場合、第三回で水平軸をGetAxisRawで取得しているので感度を変えてもあまり意味はないです)

これで、左スティックで移動ができるようになりました。

そして、上で設定した軸とは違う軸として新しく「Horizontal」を用意して(3つ目)、上のように設定します。

これで十字キーによる左右移動が実装できました。

スティックまたは十字キーの操作は「タイプ」を「ジョイスティック軸」にしていないと反応しないことに注意してください。

今回は尺の都合上やっていませんが、前回(第七回)で追加したボタンの操作をコントローラーでできるようにすることも可能です。

エクスポート

最後に、ゲームのエクスポート(exeファイルとして実行ファイルを作成)をします。

まず、編集→プロジェクト設定の、

「プレイヤー」タブからゲーム名(プロダクト名)、バージョン、アイコンなどを設定します。今回はデフォルトのままにしておきます。

その後、ファイル→ビルド設定から、

「ビルドに含まれるシーン」のタイトルのシーン(TitleScene)が一番上になっていることを確認して、「ビルド」ボタンを押します。

保存するフォルダを指定します。指定したフォルダの直下にいくつかのファイルが生成されます。

これで、エクスポートは完了です。exeファイルを開くとゲームが起動します。

今回の進捗 / ソースコード

今回はパーティクルの追加、クリア判定の作成、コントローラー操作への対応、ゲームのエクスポートを行いました。

一応この動画は、エクスポートしたゲームをGeForce Experienceの録画機能を使って録画しています。(特に設定しなくても、GeForce Experienceにゲームとして認識されました)

ソースコードこちらからアクセスできます。(TutorialGame/8にあります)

さいごに

今回は以上となります。

最初に言った通りこのUnity2Dアクションゲーム制作シリーズは今回で終了です。

他にも色々紹介したいやつ(複数ステージ・ステージ選択画面、動く床ギミック、複数レイヤーの背景などなど...)があったんですが、それらを全て紹介していると一生終わらない気がしたので、

ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方」シリーズとしては一旦ここで終わらせて、紹介したいギミック等の実装は単発の記事として作ることにします。

今回作ったゲームは一応まともに遊べるレベルには改良を続ける予定なので、その過程も報告できればなとも思っています。

シューティングゲームなどの他のジャンルのゲームの作り方も一応やる予定です。それがいつになるかはわかりませんが。

とりあえず、私はシリーズ物の記事を続けるのが苦手なので早めに終わらせることが出来てよかったです。

それでは。

【VALORANT】サンセットのサイファーを極めよう!ワンウェイスモーク・守りで使えるカメラ・ワイヤーのセットアップまとめ【ヴァロラント】

はじめに

どうも。

今回はサンセットにおける、サイファーのカメラ・ワイヤーのセットアップとサイバーケージのワンウェイを紹介します。

参考になれば幸いです。

カメラ・ワイヤーのセットアップ

Aのカメラ1(サイト内)

エルボーのここにカメラを置きます。地面に立った状態だとこれぐらいの高さにしか配置できませんが、

そのままジャンプするとこの高さで設置できます。このテクニック?は全マップで使えるので覚えておいてください。(まあ、知っている方のほうが多いと思いますが)

以降紹介するカメラは大体ジャンプして設置しています。

このような視点になります。両方の入り口から入ってくる敵を視認できます。

Aのカメラ2(サイト内)

こちらの位置にカメラを置きます。

視点はこんな感じです。1つ目に紹介したカメラはエルボーから来た敵にすぐ壊されてしまいますが、こちらは気づかれなければ敵にエントリーされたあとでも残る可能性があります。

Aのカメラ3(サイト内+ミッド)

ここの上に乗って、

ここにカメラを置きます。

このような視点になります。敵にダーツを刺すのは難しいですが、Aサイトの設置エリアの一部とミッドからのラークを確認することが出来ます。

初見なら壊されることは少ないです。

Aのカメラ4(開幕Aロビー視認)

購入フェーズ終了後すぐに、ここにカメラを設置します。

Aロビーを視認することが出来ます。ラウンド開始後すぐに情報を取ることが出来ます。

Aのカメラ4(リテイク時)

Aのリテイク時などに使えるカメラです。ジャンプしてここにカメラを設置します。

こんな感じで、Aサイトの一部とエルボーを視認することが出来ます。

Aのトラップワイヤー

Aサイトはワイヤーの有効な設置位置が多いです。以下にいくつか例を紹介します。

サイト内に置くワイヤーは足元あたりの低い位置のほうが壊されにくいです。

ここの緑色の箱は壁抜き可能なので、オーディンなどでワイヤーにかかった敵の壁抜きキルを狙えます。

Bのカメラ1(サイト内)

ここの角にカメラを置きます。

こんな感じです。起動しなければ基本壊されないので、リテイク時などに敵の位置を確認できます。

Bのカメラ2(サイト内+マーケット)

ここの窓にカメラを設置します。

マーケットとサイト内の両方を視認できます。壊されやすいので、普通の守りではあまりおすすめしません。

エコラウンド時にAにスタックするときなどに使うと良いでしょう。

Bのカメラ3(サイト内+Bメイン)

ここの木にカメラを設置します。

このカメラは敵から視認出来ない位置でも、

このように敵の足元が見えるのでBメインからの敵に対しては壊される可能性は低いです。

Bのトラップワイヤー

入口付近のここのワイヤーは誰もが知っていると思うので、他のものをいくつか紹介します。

同じく入口付近ですが、このように少し違った位置に設置するとワイヤーを警戒している敵でも掛かることがあります。

また、このようなワイヤーも敵が予期していないので掛かる可能性があります。(マーケットから掛かった敵を倒せます)

Aサイトと同様に、足元のワイヤーも引っかかりやすいです。こちらもマーケットからのキルが狙えます。

ここのワイヤーは、シャッターからマーケットに侵入してくる敵に対して有効です。

シャッタードア付近で守る味方がいない場合は設置しておきましょう。

また、ミッドのラーク対策のワイヤーも必要な場合があります。

こちらはB→Aへのローテ時に、Bにおいていたワイヤーを一つ回収してここに置くみたいな立ち回りでも良いと思います。

攻めでのカメラ

攻めにおいて使えるカメラをいくつか紹介します。

Aリンク

ラウンド開始時にここにカメラを置きます。

Aリンク側の敵を視認することが出来ます。敵がいた場合すぐ壊される可能性が高いので、他のイニシエーターが索敵できる場合はそれを頼ったほうが良い場合もあります。

Bメイン

開幕時にここにカメラを置きます。

ラウンド開始直後に詰めてくる敵を視認することが出来ます。

サイバーケージのワンウェイスモーク

Aメイン(守り)

ここの壁際に立って、

カメラを構えてカメラのUIの上端を赤く囲ってあるところに合わせてサイバーケージを投げます。(Qキー)

ワンウェイスモークになります。

Aエルボー(守り)

ここのピンのあたりに立って、

赤く囲ってある隙間にサイバーケージを投げます。

結構適当に投げても成功します。

エルボーに対してのワンウェイスモークになります。

Aメインオーブ(攻め)

ここの角に立って、

カメラを構えて、マウスのアイコンの上端が赤く囲ってある白いドットの下になるようにエイムしてサイバーケージを投げます。(Qキー)

これで、オーブを取ろうとした敵を一方的に倒すことが出来ます。成功する確率は低いですが、もし成功できたら相手に多大なる精神的ダメージを負わせることが出来ます。

Bメイン

ここの小さな箱の上の角に立って、

青く縁取ってある穴の左下の角に向かってエイムしてサイバーケージを投げます。

こんな感じになります。普通に使っても良いですが、

このワンウェイを置いた状態でここにカメラを設置して、

Bメインのここに隠れると、

ワンウェイスモークによりBメインの障害物の裏への警戒心が薄れ、さらに成功する可能性が高くなります。

さいごに

今回は以上となります。

他のエージェント・他のマップでの定点まとめはこちらから一覧で見れます。良ければどうぞ。

www.umagame.info

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #7 効果音 / タイトル画面 / メニュー画面

はじめに

こんばんは。あけましておめでとうございます。

今回もUnityをやります。

前回:

www.umagame.info

効果音の追加

Audio Sourceの追加

まずは、効果音を追加していきます。同じ要領でBGMの追加もできますが、今回は音源を用意できなかったのでBGMは追加しません。

まず、音源ファイル用のフォルダを作成します。

名前はSoundsにします。

用意した音源ファイルを入れます。周波数の関係で、mp3ファイルを入れると音が正しく認識されない場合があるのでwav形式がおすすめです。

mp3→wavへの変換は調べれば変換サイトがいくつもあるのでそれを使いましょう。

今回はジャンプ時、前回(第6回)追加したブロックの破壊時、コインの所得時に再生される効果音を追加します。

Playerオブジェクトのインスペクターから、「Audio Source」というコンポーネントを追加します。

「オーディオクリップ」に音源ファイルをドラッグアンドドロップします。

同じようにして、3つのAudio Sourceを作ります。

この3つは全て効果音なので、インスペクターから「ゲーム開始時に再生」のチェックを外しておきます。BGMの場合はチェックを入れたままでOKです。

スクリプトの編集

Player.csを書き換えて効果音が鳴るようにします。

//Player.cs

public class Player : MonoBehaviour
{
    public AudioSource JumpSE;
    public AudioSource BreakSE;
    public AudioSource MoneySE;

    void Update()
    {
        if (Input.GetButtonDown("Jump") && isGrounded())
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
            //ジャンプ音の追加
            JumpSE.Play();
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        //Breakable
        BoxCollider2D c = GetComponent<BoxCollider2D>();
        if (obj.CompareTag("Breakable") && rb.velocity.y == 0 &&
            obj.transform.position.y - obj.GetComponent<Collider2D>().bounds.size.y / 2 >= this.transform.position.y)
        {
            GameObject.Destroy(collision.gameObject);
            //ブロック破壊音の追加
            BreakSE.Play();
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        GameObject obj = collision.gameObject;

        //Collectable
        if (obj.GetComponent<Collectable>() != null)
        {
            if(obj.GetComponent<Collectable>().ID == "money")
            {
                Money++;
                GameObject.Destroy(obj);
                //コイン取得音の追加
                MoneySE.Play();
            }
        }
    }
}

3つのAudioSource型public変数を作って、ジャンプ・ブロック破壊・コイン取得を実装している部分でPlay()を呼び出して効果音を再生するようにしています。

Playerオブジェクトのインスペクターに戻って、先程作ったAudio Sourceを適用します。

3つとも設定します。

これで、効果音の実装は完了です。Audio Sourceの設定から、音量設定やピッチの変更なども出来ます。

タイトル画面

シーンの作成

次に、タイトル画面を作っていきます。

その前に、すでにあるシーン(SampleScene)の名前を変更しておきます。

MainSceneにしました。

Assets/Scenesで右クリック→作成→シーンをクリックして新しいシーンを作ります。

名前はTitleSceneにします。

作ったやつをダブルクリックして開くと、シーンが切り替わります。新規作成時は、Main Cameraのみある状態です。

背景の追加

まずは、背景を追加します。右クリック→UI→「Raw 画像」をクリック。

名前はBackgroundにします。

同時にCanvasも作成されるので、Canvasの「レンダーモード」を「ワールド空間」にして、

XおよびY座標を0に設定します。

その後、BackgroundのXY座標・幅高さをこのように変更します。幅と高さの比は用意した背景用画像と合わせてください。(今回は16:9です)

「スケール」を調整して、カメラがBackgroundで全て埋まるようにします。(Xの左のボタンを押すとXYZ全て同じ値に保ったまま変更できます)

画像を取り込んで、上画像のように設定します。

いつも通り「単位毎のピクセル数」、「フィルターモード」、「圧縮」の設定を変更して、「ラップモード」を「繰り返し」に設定します。

(単位毎のピクセル数は変更しなくても良かったですが、一応設定しておきます)

ちなみに今回使う画像はこちらです。(サイズは320x180)

ドラッグアンドドロップで、Backgroundオブジェクトの「テクスチャ」に画像を設定します。

これで背景自体は完成ですが、今回は背景をスクロールさせてみようと思います。

背景のスクロール

背景のスクロールの制御と、後ほど追加するボタンの処理を書くためのスクリプトを作成します。

名前はTitleManagerにします。

コードは以下のようになります。

//TitleManager.cs
public class TitleManager : MonoBehaviour
{
    public RawImage BackgroundImage;
    public float ScrollSpeed;
    void Start()
    {
        
    }

    void Update()
    {
        BackgroundImage.uvRect = new Rect(BackgroundImage.uvRect.position + new Vector2(ScrollSpeed, 0) * Time.deltaTime, BackgroundImage.uvRect.size);
    }
}

RawImageのUVRectを取得し、そのX座標を変更することでスクロールを実装しています。スクロールの速度はScrollSpeedで設定します。

スクリプトをEventSystem(UI追加時に作成されるオブジェクト)に適用します。

BackgroundImageとScrollSpeedを設定します。(何故かインスペクターでは日本語で表示されている...)

これで、画像が横にスクロールするようになりました。スクリプトを書き換えれば、縦方向に動かすことも出来ます。

ボタンの追加

カスタムフォントの追加

ボタンを追加していきます。

まず、ボタンのテキストに使うフォントを新しく追加します。

フォント用のフォルダを作成します。

名前はFontsにします。

今回使用するフォントは「k8x12」という8x12のドットフォントです。フリーフォントなので自由に使用できます。ありがたい。

littlelimit.net

ttf(TrueTypeFont)形式でフォントをダウンロードし、ttfファイルをFontsフォルダに入れます。

その後、画面上部メニューのウィンドウ→「TextMeshPro」→「フォントアセットクリエーター」をクリック。

新しいウィンドウが開くので、「Source Font File」にttfファイルを指定して、「Atlas Resolution」をどちらも8192にします。

こちらのサイトから、文字リストを取得します。(https://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4

右上の「Raw」をクリックして、

表示されたテキストを全て選択してコピーします。

これを、Font Asset Creatorの「Custom Character List」にペーストします。

先程貼ったリンクのページに半角カタカナ・全角英数字・波ダッシュの文字列もあるのでこちらも追加しておきます。

コピーして、

同様に「Custom Character List」に追加でペーストします。

その後「Generate Font Atlas」をクリックして、フォントアセットを新しく作成します。

生成が始まります。しばらく待ちましょう。

生成が終わったら(「Generation completed in: ...」と表示されたら)、「Save」をクリックして、

Fontsフォルダを指定して、assetファイルを保存します。

ボタンの追加

ボタンの背景用の画像を取り込んで、画像の設定をいつも通り行います。

Sprite Editorからスライスも行います。今回は上画像のように、通常時・選択時(ハイライト)・押下時のボタンのテクスチャを用意しました。

新しくボタンのオブジェクトを追加します。右クリック→UI→「ボタン - TextMeshPro」をクリック。

今回はタイトルにゲームスタート用ボタン(StartButton)とゲーム終了用ボタン(ExitButton)の2つを追加します。

ボタンのインスペクターから、「ソース画像」に通常時のボタンのスプライト(今回はbutton_0)を指定します。

その後Buttonコンポーネントの「遷移」を「スプライトスワップ」にして、

  • 「Highlighted Sprite」と「Selected Sprite」に選択時のボタンのスプライト(今回はbutton_1)を設定

  • 「Pressed Sprite」と「Disabled Sprite」に押下時のボタンのスプライト(今回はbutton_2)を設定

の2つの設定をします。

ボタンのテキストはそれぞれのボタンの子オブジェクトとして作られています。これを選択して、

インスペクターから「Font Asset」に先程作ったフォントアセットを指定して、「Font Size」を小さくして、表示されるテキストを設定します。

ExitButtonも同様に設定します。

ボタンの処理

ボタンを押したときの処理を設定します。

まず、先程作ったTitleManager.csにコードを追加します。

public void StartButton()
{
    SceneManager.LoadScene("MainScene");
}
public void ExitButton()
{
    Application.Quit();
}

上記の2つのメソッドを追加します。StartButton()ではMainSceneをロードする処理を、ExitButton()ではゲームを終了する処理をしています。

ボタンのインスペクターから、「クリック時()」の+ボタンを押して、

オブジェクトの部分にEventSystemを指定して、TitleManagerの該当するメソッドを設定します。上画像はスタートボタンなのでStartButton()を設定します。

ExitButtonも同様に設定します。

これで、TitleSceneでスタートボタンを押すと

ゲーム画面に移るようになります。ちなみに、エディタ内のテストプレイではExitボタンを押しても何も起きません。

ゲームオーバー画面・メニュー画面

ゲームオーバー画面の作成

ゲームオーバーになったときの画面と、ゲーム内からタイトルにアクセスできるようにメニュー画面も作ります。

MainSceneに戻って、Canvas内に新しくパネルを追加します。(右クリック→UI→パネル)

名前はGameoverPanelにします。

今回はパネル背景用の画像を用意するのがめんどくさかったので、真っ白の16:9の画像を用意しました。

アンカープリセットをこれに変えます。(これでXY座標・幅高さの数値でパネルの大きさ・位置を変えれるようになります)

XY座標、幅高さをこのように設定しました。(カメラにちょうど収まるサイズです)

色を半透明の黒にします。上画像のように設定しました。

次に、タイトル画面と同じようにテキスト・ボタンを追加します。GameoverPanelを右クリック→UI→テキストをクリックして、

タイトル画面と同じ要領で設定をします。

ボタンも同様に追加します。ボタンの処理は、GameManager.csに以下のメソッドを追加して作りました。

public void RetryButton() //リトライボタン
{
    SceneManager.LoadScene("MainScene");
    Time.timeScale = 1.0f;
}

public void TitleButton() //タイトルへ移動するボタン
{
    SceneManager.LoadScene("TitleScene");
    Time.timeScale = 1.0f;
}

シーンのロードは今までと同じです。Time.timeScaleを1に設定している理由は後ほど説明します。

ゲームオーバー画面はゲームスタート時は非表示なので、インスペクターの上部の名前欄の左のチェックを外しておきます。これでGameoverPanelは非アクティブ(Inactive)になりました。

Player.csを以下のように変更します。

//Player.cs

public class Player : MonoBehaviour
{

    public GameObject GameoverPanel;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GameObject obj = collision.gameObject;

        //InstaDeath
        if (obj.CompareTag("InstaDeath"))
        {
            GameoverPanel.SetActive(true);
            Time.timeScale = 0;
        }
}

第五回で設定した、InstaDeathに触れたときの処理を変更します。

GameoverPanelをアクティブ(チェックが入った状態)にして、Time.timeScaleを0にします。

Time.timeScaleはゲーム内の時間の流れる速さを表していて、通常時は1です。これを0にすることで重力や移動の処理が止まります。

これが0のままだとゲームを再開しても動けない状態になってしまうので、リトライボタンを押したときにこれを1に戻すようにしています。

インスペクターからGameoverPanelのオブジェクトを指定します。

これで実装自体は完了ですが、新しく作ったTitleSceneがまだゲームに登録されていないのでそれをします。

上部メニューのファイル→「ビルド設定」をクリックして、

「ビルドに含まれるシーン」にTitleSceneをドラッグアンドドロップで登録します。

これで、穴に落ちるとゲームオーバー画面が表示されるようになります。

メニュー画面の作成

次に、ゲーム内でEscapeキーを押すとメニュー画面(ポーズ画面)が表示されるようにします。

まず、メニュー画面を作ります。ゲームオーバー画面のようにテキストとボタンのみを配置するだけなので、さっき作ったGameoverPanelをコピーして作りました。

入力マネージャーから新しく入力軸を追加します。メニューの編集→「プロジェクト設定」をクリックして、

入力マネージャーで新たに「Escape」という軸を追加します。今回は初期設定で存在した「Fire2」という軸の正方向ボタンを「escape」に変更してEscapeとしました。

そして、Player.csのUpdate()を以下のように変更します。

void Update()
{
    if (Time.timeScale != 0) //timeScaleが0のとき移動できないようにする
    {
        //Player Movement
        if (!isDashing)
        {
            rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);
        }
        else
        {
            rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * DashSpeed, rb.velocity.y);
        }

        if (Input.GetButtonDown("Jump") && isGrounded())
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
            JumpSE.Play();
        }

        if (Input.GetButton("Dash"))
        {
            isDashing = true;
        }
        else
        {
            isDashing = false;
        }
    }

    if (Input.GetButtonDown("Escape"))
    {
        if (MenuPanel.activeSelf)
        {
            MenuPanel.SetActive(false);
            Time.timeScale = 1.0f;
        }
        else
        {
            MenuPanel.SetActive(true);
            Time.timeScale = 0;
        }
    }
}

移動を実装していた部分をif文で囲み、Time.timeScaleが0のときは移動が出来ないようにします。これでポーズを実装しています。

また、Escapeが押されたときにメニュー画面の表示の切り替えおよびtimeScaleの変更を行っています。(GameObjectのアクティブ状態は、GameObject.activeSelfで取得できます)

MenuPanelオブジェクトを設定して、完成です。

これで、Escキーを押したときに時間が止まり(ポーズ中に遷移)メニュー画面が表示されるようになりました。

今回の進捗 / ソースコード

今回は効果音の追加・タイトル画面の追加・メニュー画面の追加を行いました。

効果音は一応Magical 8bit Plugという8bitゲームの音を再現したシンセを使って作ったんですが、あまり出来が良くなかったです。普通にフリーの音源を使ったほうが良いですね。

今回は忘れていたので追加していませんが、ボタンを押したときの効果音もあったほうが良いですね。

ソースコードは例によって、こちらのリンクからアクセスできます。(TutorialGame/7にあります)

さいごに

今回は以上となります。

次回はUnityのパーティクルシステムをやると思います。多分。

次回:

www.umagame.info

【VALORANT】各マップ・各エージェントの定点紹介記事まとめ【ヴァロラント】

はじめに

どうも。

このブログでは過去に色々なエージェントの定点まとめ記事を投稿してきました。

量が多くなってきたので、それらを一覧で見れるようにここにリンクをまとめておくことにします。キャラ別にまとめました。

昔(1~2年以上前)に投稿した記事も載せています。よってアップデートによるマップの構造の変化などに対応していない場合もあります。

また、タイトルに「全マップ」と書いてある記事は記事執筆時点での全マップのことなので、サンセットなど新しいマップは基本的に含まれていません。

新しいマップについてはこれから記事を書いていく予定なので気長にお待ち下さい。

サムネ用

ブリムストーン(バインド・フラクチャーなど)

ブリムストーンはバインドとフラクチャーでの空爆の定点まとめの他に、フラクチャー追加時点での全マップ(サンセットなどは含まない)での空爆まとめがあります。

バインド:

www.umagame.info

ラクチャー:

www.umagame.info

ラクチャー登場時点での全マップ:

www.umagame.info

ソーヴァ(アセント・ブリーズ・アイスボックスなど)

ソーヴァはアセントとブリーズ、アイスボックスでのリコン・ショックダーツの定点まとめの他に、フラクチャー追加時点での全マップでのダブルショックダーツまとめがあります。

アセント(前後編に分かれています):

www.umagame.info

www.umagame.info

ブリーズ:

www.umagame.info

アイスボックス:

www.umagame.info

ラクチャー登場時点での全マップ:

www.umagame.info

ヴァイパー(スプリット・アイスボックスなど)

ヴァイパーはスプリット・アイスボックスでのセットアップ・空爆の定点まとめの他に、フラクチャー追加時点での全マップでの空爆・セットアップ・ワンウェイスモークまとめがあります。

スプリット:

www.umagame.info

アイスボックス(パッチ8.0対応):

www.umagame.info

空爆・セットアップ(ブリーズまで):

www.umagame.info

ワンウェイスモーク(フラクチャーまで):

www.umagame.info

サイファー(サンセット・アセント・ヘイブンなど)

サイファーはアセント・ヘイブン・バインド・ヘイブン・アイスボックス・フラクチャーおよびサンセットでのセットアップまとめがあります。

サンセット:

www.umagame.info

アセント・スプリット:

www.umagame.info

バインド・ヘイブン:

www.umagame.info

アイスボックス・フラクチャー:

www.umagame.info

KAY/O(アセント・ヘイブンなど)

KAY/Oはロータス登場時点での全マップでのナイフの定点まとめがあります。

www.umagame.info

キルジョイ(アセント)

キルジョイはアセントでのセットアップ・空爆まとめがあります。

www.umagame.info

オーメン(アセント・ヘイブン・スプリット・ロータス

オーメンはアセント・ヘイブン・スプリット・ロータスオーメンがよく使われるマップをピックアップしました)でのワンウェイスモークまとめがあります。

www.umagame.info

デッドロック

デッドロック(需要皆無)の壁の定点もあります。一応載せておきます。

www.umagame.info

さいごに

この記事は新しい定点まとめ記事を投稿するたびに更新します。

ぜひ参考にしてみてください。

【VALORANT】アセントのキルジョイを極めよう!守りのセットアップ・解除阻止空爆・ウルトと使う空爆の定点まとめ!【ヴァロラント】

はじめに

どうも。

今回は、アセントで使えるキルジョイのセットアップおよびグレネード(ナノスワーム)の空爆の定点を紹介します。

参考になれば幸いです。

守りのセットアップ

Aサイト(ラッシュ止めセットアップ1)

キルジョイはBを守ることが多いですが、味方のエージェント構成や敵の攻め方によってはAを守るほうが良い場合もあります。

これはその一例で、ナノスワームでラッシュを止めるセットアップです。

まず、ナノスワームとアラームボットをこのように置きます。

そして、もう一つのナノをここに置きます。

そして、タレットをヘブン下のここに置きます。

このタレットは、敵がここまで進行したときに反応します。

グレネードを展開するとこんな感じになります。アラームボット及びタレットが反応したタイミングで起動するとキルを狙えます。

Aサイト(ラッシュ止めセットアップ2)

アラームボットとドア付近のナノスワームをさっきのものと同じ場所に置き、2つ目のナノスワームをここに置くと、

スパイク設置者を狙うことも出来ます。入口付近のグレネードは同じセットアップを何度も使うと壊される可能性が高いので、味変として使いましょう。

Bサイト(アッパー側セットアップ)

Bサイトのアッパー側から攻めてくる敵をキルするセットアップです。

ここの隙間にナノスワームを入れます。

もう一つのナノスワームをここに置いて、

アラームボット、タレットをこのように置きます。守る際はボートハウスや箱裏で敵が来るまで待ち、

敵が来たらナノスワームを展開します。ロウワー側から詰めてくる敵に注意しましょう。

Bサイト(ラッシュ止めセットアップ)

Bサイトのラッシュを手前で止めるセットアップです。

ここにナノスワームを置きます。

そしてもう一つのナノとアラームボットをこのように置きます。

これで、ラッシュを足止めすることができます。グレの展開が早すぎるとキルに繋がらないので、入ってきたタイミングで使いましょう。

タレットはここか、

ここ(薪)に置くのがおすすめです。

Bサイト(スイッチセットアップ)

Bサイトのドアのスイッチ周辺のセットアップです。主にスイッチを押しに来たジェットを倒す目的で使います。

ここにアラームボットを置き、

ここと、

ここにナノスワームを置きます。

タレットはここがおすすめです。

グレを展開するとこんな感じです。

紹介したセットアップは全てアラームボットをBサイト側に置いているので、もしミッドを守る味方がいない場合はアラームボットをミッドに使うなど、状況に合わせてセットアップも変えましょう。

解除阻止空爆(ナノスワーム)

攻撃側で、スパイク解除を遅延するための空爆グレです。ブリムなどの他キャラとは違ってグレネードを壊されるので、過信は禁物です。

Aメイン→Aデフォルト設置

Aメインからデフォルト設置(黒コン前設置)への空爆です。

ここの角に立って、

この雲の左側の出っ張っている部分にエイムして投げます。

ここに着弾します。

Aメイン→箱裏設置

Aメインから箱裏設置への空爆です。

さっきと同じ角に立って、

背景の尖っているやつの先端にエイムして投げます。

ここに着弾します。

Bロビー→箱裏設置

Bロビーから箱裏設置への空爆です。

ここの角に立って、

背景の尖っているやつの先端にエイムして投げます。

ここに着弾します。

Bロビー→角設置

Bロビーから角設置への空爆です。多分こっちのほうが使う機会が多いと思います。

さっきと同じ角に立って、

青線で縁取っている雲の、左下のあたりにエイムして投げます。(若干左寄りに投げるといい感じです)

ここに着弾します。

キル用空爆(ナノスワーム)

スパイク設置位置以外への空爆をまとめました。

Aメイン→黒コン裏

ここの角に立って、

このように、壁のレンガの角と背景の尖っているやつの間にエイムして投げます。

ここに着弾します。味方がエントリーするタイミングで使いましょう。

Aツリー→ワイン(リテイク用ウルト使用時に使える)

よく使われる、Aショートのこの角に置くウルトと合わせて使うと強い空爆です。

ウルト設置後、急いでここの角に立って、

青線で表しているひし形の上端にエイムして投げます。

ワインに着弾します。ワインに逃げた敵のキルを狙えます。

Bメイン→ボートハウス(リテイク用ウルト使用時に使える)

こちらも、ウルトと合わせると強い空爆です。

ここの角にウルトを置きます。(壁沿いに置くと、オーディンシェリフの壁抜きで壊されます)

その後ここの角に立って、

赤く囲ってある、鉄格子と壁の隙間の真上にエイムして、前に進みながら投げます。

ここに着弾します。こちらも、ウルトから逃げた敵のキルを狙えます。

さいごに

今回は以上となります。

先述の通り、Bサイトのセットアップに関してはは全てアラームボットをBサイト側に置いているので、もしミッドを守る味方がいない場合はアラームボットをミッドに使うなど、状況に合わせてセットアップも変えましょう。

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #6 コイン(収集アイテム) / 破壊可能ブロック

はじめに

どうも。Unity2Dアクションゲーム制作第6回です。

今回は収集可能なコインと、下からジャンプして叩くことで壊れるブロックを作ります。

前回:

www.umagame.info

コインの追加

オブジェクトの作成・スプライト

まず、コインの追加を行います。

今回はこんなスプライトを用意しました。

ウマ娘 プリティーダービーより

見た目はコインですが、元ネタ(ウマ娘)ではマニーという名前なのでUnity内ではこっちに合わせます。

画像のインポート・設定(やり方は第2回または第3回参照)をしたら、画像をそのままシーン内にドラッグアンドドロップして新たにオブジェクトを作成します。(ヒエラルキー内で右クリック→作成でも可)

名前もちゃんと変えておきます。

新しくスクリプトを作ります。

コイン以外にも回収可能なアイテムを作る可能性があるので、名前はCollectable(収集可能)にします。

//Collectable
public class Collectable : MonoBehaviour
{
    public string ID;

    void Start()
    {
        
    }

    void Update()
    {
        //Rotation
        this.transform.Rotate(0, 0.3f, 0);
    }
}

コードはこんな感じです。publicのstring型変数IDを持ち、毎フレーム0.3°だけY軸が回転します。

スクリプトをMoneyオブジェクトに適用して、IDを「money」に設定します。このIDは後ほど使います。

これでテストプレイすると、コインが回転します。現時点では、コインに触れても何も起きません。

トリガーの設定

先程作成したMoneyのオブジェクトにコライダーを追加します。円の形なので、「Circle Collider 2D」を使います。

ここで、「トリガーにする」にチェックを入れます。

コライダーをトリガーとして使うと、他のオブジェクトとの当たり判定がなくなりますが他のオブジェクトと重なりを検知することが出来ます。

そして、Player.csに以下のコードを追加します。

//Player.cs
public class Player : MonoBehaviour
{

    public int Money = 0;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        //コード簡略化のためにobjを追加
        GameObject obj = collision.gameObject;

        //InstaDeath
        if (obj.CompareTag("InstaDeath"))
        {
            SceneManager.LoadScene("SampleScene");
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        //コード簡略化のためにobjを追加
        GameObject obj = collision.gameObject;

        //Collectable
        if (obj.GetComponent<Collectable>() != null)
        {
            if(obj.GetComponent<Collectable>().id == "money")
            {
                Money++;
                GameObject.Destroy(obj);
            }
        }
    }
}

トリガーに設定したコライダーとの接触時に、OnTriggerEnter2Dというメソッドが呼び出されます。

そのトリガーがCollectable(回収可能なアイテム)かどうかを判定して、そのIDが"money"であれば以下の処理を実行します。

  1. public int変数であるMoneyを1増やす(Moneyは獲得したコインの総数です)

  2. コインのオブジェクトを削除

トリガーのオブジェクト(この場合はコインのオブジェクト)はOnCollsionEnter2Dと同様にcollision.gameObjectで取得できますが、長いのでobjという名前の変数に格納して使うようにしています。

前回(第5回)に追加したOnCollsionEnter2Dでもobjを使うように修正しておきました。

UIの追加

コインを取得した数をテキストで表示するようにします。

ヒエラルキーで右クリック→UI→「テキスト - TextMeshPro」をクリック。

名前はMoneyTextにします。

TextMeshProを初めて作成したときは、このようなウィンドウが開きます。

上の「Import TMP Essentials」をクリックして、TMP Essentialsをインポートしましょう。これはTextMeshProを使う際に必須となります。

下の「TMP Examples & Extras」はあってもなくてもどちらでも良いです。私はインポートしませんでした。

テキストを追加しましたが、シーン内にそれらしきものは見えないと思います。

それもそのはずで、このように初期設定のままだとテキストが作ったマップと比べてとてつもなく大きくなってしまっています。

ちなみに、右上のやつはCanvas(テキストなどのUIを配置するエリア)の中心です。

まず、Canvasをカメラ(Main Camera)の子オブジェクトにします。CanvasをMain Cameraにドラッグアンドドロップしてください。

これで、テキストを含むUIがカメラに追従するようになります。

次にCanvasのインスペクターから、「レンダーモード」を「ワールド空間」に設定して、

テキスト(MoneyText)の位置と幅、高さをこのように設定します。

するとこのような黄色の枠が表示されるので、位置を移動させ、黄色の枠が横長になるようにします。

テキストのインスペクターの「Font Size」を小さくします。今回は0.5にしました。

テキストの内容(初期設定では「New Text」になっていると思います)は変更しなくて良いです。

画像UI / テキスト制御スクリプト

画像のUIも追加します。

Canvasを右クリック→UI→「画像」をクリック。

名前はMoneyIconにします。

幅・高さを1に設定します。幅と高さの比はテクスチャに合わせてください。今回は正方形のテクスチャ(幅:高さ=1:1)なのでどちらも1にしています。

テキストの隣に置きます。

そして、画像ファイルを「ソース画像」にドラッグアンドドロップして画像を設定します。

画像のアニメーションとテキストの変更を行うスクリプトを作成します。名前はGameManagerにします。(正直名前は何でも良いです)

//GameManager.cs
public class GameManager : MonoBehaviour
{
    public TextMeshProUGUI MoneyText;
    public UnityEngine.UI.Image MoneyIcon;

    public Player PlayerObj;

    void Start()
    {
        
    }

    void Update()
    {
        MoneyIcon.GetComponent<RectTransform>().Rotate(0, 0.3f, 0);

        MoneyText.text = ":" + PlayerObj.Money
    }
}

中身はこんな感じです。

Update()にコインの画像を回転させる処理と、テキストにPlayer.Moneyを表示する処理を書いています。

作ったスクリプトを適用します。新たに空のオブジェクトを追加してもいいのですが、今回はTextMeshProを作成した際に追加に作成されたEventSystemを使おうと思います。

テキスト、画像、プレイヤーのオブジェクトを設定します。

これで、コインを取得した際にその数が表示されるようになりました。

これでコインの実装は完了ですが、複数のコインをマップ上に置くのでもう少しだけ作業が必要です。

まず、新しく空のオブジェクトを作成します。これはコインをたくさんコピーしたときに、ヒエラルキーがコインまみれにならないようにするためだけのオブジェクトです。

名前はMoneyObjectsにしておきます。

MoneyオブジェクトをMoneyObjectsにドラッグアンドドロップして、子オブジェクトにします。

次に、プレハブ用のフォルダを作ります。プレハブとは、同じオブジェクトをコピーしてたくさんシーンに置くために使う設計図のようなものです。

名前はPrefabsにします。

PrefabsフォルダにMoneyオブジェクトをドラッグアンドドロップして、Moneyのプレハブを作ります。

その後Moneyのコピー&ペーストを繰り返して、マップにコインを配置します。

配置する際は、グリッドスナップと呼ばれる機能を使うと便利です。

シーン上部のメニューを上画像のように設定して、グリッドスナップの「グリッドサイズ」をいじることでグリッドに合わせてオブジェクトを配置できるようになります。

(左から「ピボット」、「グローバル」となるようにして、磁石のアイコンをクリック)

プレハブの便利なところは、この多くのMoneyオブジェクトの設定を変えようとした際に、プレハブ側の設定を変えるだけでマップ上のすべてのMoneyオブジェクトも変更されるということです。

プレハブの設定を変える際は、Prefabsフォルダに作ったプレハブをダブルクリックすると編集画面に移ることが出来ます。

これでコインは完成です。

破壊可能レンガの追加

オブジェクトの追加 / スクリプトの編集

次に、下から叩くと壊れるブロックを追加します。

前回(第5回)と同様にタイルのテクスチャファイルを更新し、Sprite Editorからスライスし直します。今回は4種類のレンガのテクスチャを用意しました。

右クリック→「2Dオブジェクト」→「スプライト」→「正方形」から新しくオブジェクトを作成し、

スプライトを適用します。(名前はBreakableBricksとしました)

コライダー(Box Collider 2D)を追加します。

そして、破壊可能かどうかを判別できるようにタグを追加します。タグ→「タグを追加」をクリック。

名前はBreakableとしておきます。

これでブロック側の設定は完了...と言いたいところですが、

こちらもタイルマップ同様に移動キーを押しながら側面に接触すると引っかかりますので、これを修正しておきます。

修正方法は前回(第5回)と同じです。「Platform Effector 2D」を追加して、

エフェクターで使用」をオンに、「1方向の衝突判定を使用」をオフにするだけです。

あとはPlayer.csを少しいじるだけでOKです。

//Player.cs
private void OnCollisionEnter2D(Collision2D collision)
{
    GameObject obj = collision.gameObject;

    //InstaDeath
    if (obj.CompareTag("InstaDeath"))
    {
        SceneManager.LoadScene("SampleScene");
    }

    //Breakable
    BoxCollider2D c = GetComponent<BoxCollider2D>();
    if (obj.CompareTag("Breakable") && rb.velocity.y == 0 &&
        obj.transform.position.y - obj.GetComponent<Collider2D>().bounds.size.y / 2 >= this.transform.position.y)
    {
        GameObject.Destroy(collision.gameObject);
    }
}

OnCollsionEnter2Dを上記のように編集します。

今回はブロックの下からプレイヤーが衝突してきたかどうかの判定を以下の条件を使って実装しました。

(実装方法はこれ以外にもあります。というか正直、この実装の仕方は個人的には納得してませんが、これより良い方法が思いつきませんでした)

  1. 衝突対象が「Breakable」のタグを持っている

  2. プレイヤーのY軸方向の速度が0(衝突した瞬間はY軸方向の速度が0となるので)

  3. プレイヤーのY座標が、衝突対象(ブロック)の当たり判定の下端のY座標より小さい

これら3つの条件すべてを満たした際に、衝突対象であるブロックのオブジェクトを削除するようにしています。

これで、破壊可能なブロックの実装は完了です。

プレハブの作成

コインと同様に、ブロックのプレハブも作ります。

その前に、作ったブロックをコピーして色違いも作成しておきます。

先程と同様に、空のオブジェクト(BricksObjects)を作成してブロックをその子オブジェクトとします。

Prefabsフォルダにドラッグアンドドロップでプレハブを作成します。

あとはコピペでマップに配置しましょう。こちらもグリッドスナップを使うと便利です。

今回の進捗 / ソースコード

今回は、収集可能アイテム(コイン)と下から叩くと破壊できるブロックを追加しました。

言うのを忘れていましたが、3ブロックの高さを超えられるようにジャンプ力を15から17に変えています。

こんな感じで、簡単なギミックなら数行のコードで再現できてしまいます。プログラミング下手な私でも。

ソースコードは前回と同様に、GitHubからコピペまたはダウンロードできます。今回は第6回なので、TutorialGame/6にスクリプトを置いています。

https://github.com/Umagame/TutorialGame

さいごに

今回は以上となります。

一応このシリーズの目的はUnityの使い方を解説することなので、今回のようなギミックを追加する回はこれで終わりです。多分。

次回は、効果音およびBGMの追加とタイトル画面・ゲームオーバー画面の実装を予定しています。

投稿日は未定ですが多分年内には出せます。

↑出せませんでした。

www.umagame.info

【VALORANT】スプリットのヴァイパーを極めよう!攻め・守りで使える壁・スモーク・空爆・ウルトの定点まとめ【ヴァイパー 定点まとめ】

はじめに

どうも。

今回はスプリットで使えるヴァイパーの定点(壁・スモーク・空爆・ウルト)をいくつかご紹介します。

参考になれば幸いです。

壁(トキシックスクリーン)

A攻め(ラーク用)

よく使われる、スロープとヘブンを隠す壁は皆さん知っていると思うので割愛します。

それ以外の壁として、ラークの際に有効な壁を紹介します。

スロープに敵がいなければ、敵に視認されずにベント周辺までラークで進行することが出来ます。Aに全員でラッシュする際にはあまり使えません。

A守り

A守りの際に使える壁です。

ベントのここの角に立って、

赤線が交差する点にエイムして壁を展開します。

敵(攻撃側)視点ではベント側が見えにくく、

味方(防衛側)視点ではここの角の敵を視認することが出来ます。

また、サイトのここの角に隠れるスペースも作ることが出来ます。

スモーク(ポイズンクラウド

A攻め(スロープ)

スロープからの斜線(特にオペレーター)を警戒する際に使うスモークです。

Aロビーから、赤線と青線の交わる所あたりに投げます。基本的にAロビーのどこから投げてもOKです。

こんな感じです。

A攻め(スクリーン・エルボー)

ここの角に立って、

赤く囲ってある、背景の灰色の線の先にエイムして、ジャンプ投げします。

こんな感じです。エルボーとスクリーンからの斜線を切れます。

A攻め(スパイク設置位置ワンウェイ)

Aロビーから設置位置へのスモークです。

ここの壁際に立って、

このように、赤く囲ってある壁が垂直に見えるような位置に移動します。

そして、赤く囲ってある所へエイムして投げます。

スパイク設置位置(オープン設置・デフォルト設置)のワンウェイになります。

ミッド守り(ベントから)

購入フェーズのときにここの角に立って、

このあたりにエイムして(適当で良いです)投げます。

こんな感じです。

ミッド守り(Bから)

購入フェーズのときにここの角に立って、

赤い矢印て示している、壁の黒いドットの少し上にエイムして投げます。

このあたりです。

こちらも同様に、ミッドの進行を防ぐスモークになります。

B攻め(ドライ進行)

ここの壁の線の前にたって、

ポイズンクラウドの上のUIの左上の角を、赤く囲ってあるところのように合わせて投げます。

ここに落ちます。

壁と合わせて使うことで、サイト中にドライで進行することが出来ます。

B守り(ワンウェイ)

ガレージのワンウェイスモークです。以前紹介したものより簡単です。

購入フェーズでここの角に立って、

赤矢印で示している、蛍光灯の下の2つの長方形のうちの上のやつの中央にエイムして投げます。

こんな感じです。

ワンウェイスモークになります。

空爆(スネークバイト)

A攻め(スクリーン・エルボー)

ここの壁に立って、

赤く囲ってある、背景の柱の先端と赤線の間にエイムして投げます。

ここに落ちます。

Aデフォルト設置

ここの角に立って、

赤線の中央にエイムして投げます。

ここに着弾します。先程紹介したワンウェイのポイズンクラウドと合わせると強力です。

Aオープン設置

ここの植木鉢の上に立って、

背景の建物の角にエイムして投げます。

ここに着弾します。こちらも、先程紹介したワンウェイのポイズンクラウドと合わせると強力です。

Bデフォルト設置(箱裏)

ここの角に立って、

背景の緑の看板の下部に注目して、赤い矢印で示している山?の先端にエイムして投げます。

(こんな感じにエイム)

ここに着弾します。

ウルト(ヴァイパーズピット)

B攻めウルト

Bサイトを取得したあとに使えるウルトです。

このあたりに立って、

床のタイルの線が交差する点にエイムして展開します。

箱の両サイドをカバーできます。

箱の隣(どちらでも良い)に設置して、ウルト内を移動して死なないように立ち回り、解除音がしたらスネークバイトを投げる...みたいな立ち回りが出来ます。

Bリテイク用ウルト

路地のここに立って、

こんな感じにウルトを展開します。(ある程度適当で良いです)

このように、設置可能な範囲すべてをカバー出来ます。

Bのリテイク時に使えます。ただし、ウルト展開時に倒されないように注意しましょう。

さいごに

今回はここまでです。

ヴァイパーは弱体化を食らってしまったので、昔のように壁・スモークを長くは展開することが出来ず使うタイミングを見極めなければいけないので難しいですね。

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #5 着地判定 / カメラ追従 / デス判定

はじめに

どうも。今日も今日とて、Unityです。

前回はアニメーションの実装を行いました。今回はジャンプが空中で出来てしまう不具合の修正と、マップの拡張・カメラの移動設定・デス判定の追加を行います。

前回:

www.umagame.info

着地判定

レイヤーの追加

まず、地面に足がついている状態でのみジャンプできるようにプレイヤーのスクリプトを修正します。

まず、「地面」を定義するために、第2回で追加したTerrainのタイルマップのレイヤーを設定します。

「レイヤー」→「レイヤーを追加」をクリック。

インスペクターでレイヤー設定の画面が表示されるので、Groundという名前のレイヤーを追加します。

ここで注意ですが、このレイヤーは第2回で設定した「ソートレイヤー」とは別物です。

「ソートレイヤー」は表示上の設定に使いますが、こちらの「レイヤー」は主に衝突判定の設定で使います。なので、上の設定画面でのレイヤーの上下関係は関係ありません。

Terrainのインスペクターでレイヤーを設定しておきます。

スクリプトの編集

では、Player.csを編集していきます。

//Player.cs

public class Player : MonoBehaviour
{
    
    public LayerMask GroundLayer;

    void Update()
    {
        if (Input.GetButtonDown("Jump") && isGrounded())
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
        }
    }

    private bool isGrounded()
    {
        BoxCollider2D c = GetComponent<BoxCollider2D>();
        return Physics2D.BoxCast(c.bounds.center, c.bounds.size, 0f, Vector2.down, .1f, GroundLayer);
    }
}

新しくboolを返すisGrounded()というメソッドを追加し、Update()のジャンプを実装していたif文の条件にisGroundedを追加します。

isGroundedでは、Physics2D.BoxCastというメソッドを使って接地判定を行っています。BoxCastは矩形の当たり判定を移動させて他のオブジェクトとの衝突を検知するやつらしいです。

インスペクターで、新しく追加したGroundLayerという変数(接地判定で地面と認識するレイヤー)を「Ground」に設定します。

これで、ジャンプの修正は完了です。

マップ拡張・カメラ移動

次に、マップを広げます。

今回はこんな感じに広げました。テストプレイ用なので適当です。

カメラ用スクリプト

カメラの移動を制御するスクリプトを作成します。

Assets/Scriptsで右クリック→作成→C# スクリプトをクリック。

名前はCameraMovementにします。(「Camera」という名前はUnityの仕様上使えないみたいです)

//CameraMovement.cs
public class CameraMovement : MonoBehaviour
{
    public GameObject Target;
    public GameObject LeftEdge;
    public GameObject RightEdge;

    void Start()
    {

    }

    void Update()
    {
        this.transform.position = new Vector3(Target.transform.position.x, this.transform.position.y, this.transform.position.z);

        if (this.transform.position.x <= LeftEdge.transform.position.x)
        {
            this.transform.position = new Vector3(LeftEdge.transform.position.x, this.transform.position.y, this.transform.position.z);
        }
        else if (this.transform.position.x >= RightEdge.transform.position.x)
        {
            this.transform.position = new Vector3(RightEdge.transform.position.x, this.transform.position.y, this.transform.position.z);
        }
    }
}

こんな感じです。GameObject型の変数を3つ使ってカメラの移動を制御しています。

ターゲット(Target)はカメラが追従するオブジェクトです。今回はプレイヤーオブジェクトを指定します。

左右の端(Left / RightEdge)はマップの端を検知するためのオブジェクトです。(これは後ほど追加します。)

まずカメラのX座標をターゲットのX座標にして、左右の端をターゲットが超えた際はカメラの座標を端に固定するという処理を行っています。

スクリプトを書いたら、カメラのオブジェクト(MainCamera)にドラッグアンドドロップで適用します。

端検知用オブジェクト

先述のマップの端を検知するためのオブジェクトを追加します。

右クリック→空のオブジェクトを作成をクリックして、オブジェクトを2つ作成します。

名前は「CameraLeftEdge」、「CameraRightEdge」にします。

Leftの方は現在カメラがある位置で良いので、X座標を0に設定します。(Y, Z座標は何でも良いです)

Rightはカメラの幅に合わせて設定します。今回はX=31としました。カメラの画面サイズが18x10なので、右端から9マスのところに置けばOKです。

PlayerとEdgeのオブジェクトをCameraMovementのスクリプトにドラッグして設定します。

こんな感じです。

これで、右へ移動するとプレイヤーに合わせてカメラも動くようになりました。

地形の当たり判定の修正

移動キーを押したまま壁に接触すると浮いてしまう不具合が判明したので、これを先に修正しておきます。

本当はこれを第2回にやるべきだったんですが、忘れてました。

Terrainオブジェクトに新しく「Platform Effector 2D」というコンポーネントを追加します。

そして、「Composite Collider 2D」の「エフェクターで使用」にチェックを入れて、「Platform Effector 2D」の「1方向の...」のチェックを外します。

これで直りました。

デス判定

デス判定タイルの追加

マップ外に落ちた際にゲームオーバーになるようにします。

まず、デス判定オブジェクト用のタイルのテクスチャを新たに追加します。

Assets/Textures/Tilesで右クリック→エクスプローラーで表示でテクスチャのフォルダを開き、画像ファイルを編集します。

マップ外に置くタイル用なので、見やすいように赤色ベタ塗りのテクスチャにしました。

画像ファイルを変えるだけではダメで、Sprite Editorでもう一度スライスし直す必要があります。

第2回と同じように。

追加したタイルが増えてるので、これをタイルパレットへドラッグアンドドロップで追加します。

タイルのファイルは第2回と同じAssets/Tilesに保存します。

これで新しいタイルを追加することが出来ました。

マップ変更・タイルマップの設定

デス判定を持つタイル用のタイルマップを作成します。

右クリック→2Dオブジェクト→タイルマップ→矩形をクリックします。

名前は「InstaDeathTiles」にします。

TerrainとBackgroundを編集して地形を変えて、

InstaDeathTilesでデス判定タイルを追加します。

InstaDeathTilesのインスペクターから、タグを追加します。タグ→タグを追加をクリックして、

+ボタンで新しくタグを追加します。名前はInstaDeathにします。

戻って、タグを設定します。プレイヤーがこのタグがついたオブジェクトに触れるとゲームオーバーになるようにするので、他のオブジェクトでもこのタグを適用するだけでデス判定を追加できます。

InstaDeathTilesにTilemap Collider 2Dを追加します。

これを忘れると、そもそもプレイヤーとこのタイルマップの衝突が検知されないので注意しましょう。

最後にプレイヤーのスクリプトを編集します。

//Player.cs
private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("InstaDeath"))
    {
        SceneManager.LoadScene("SampleScene");
    }
}

このメソッドを追加するだけです。

このOnCollisionEnter2Dのように、privateメソッドではありますがUnity側から特別な条件下で呼び出されるメソッドがあります。(詳しく知りたい方はこちらから)

タグがInstaDeathのオブジェクトと衝突した際に、シーンをロードし直すという処理を行っています。("SampleScene"にはシーンの名前が入ります。今回は未変更なのでSampleSceneのままです)

これで、穴に落ちると

一番最初の状態に戻るようになります。

最後に、左右の端に壁を追加するのを忘れていたので追加しておきます。

今回の進捗 / ソースコード

今回はジャンプの不具合の修正、マップの拡張、カメラの追従設定、そしてマップ外のデス判定の追加を行いました。

穴に落ちた瞬間にリセットとなっていますが、今後ゲームオーバー時の専用の画面を追加する予定なので、仮の仕様だと思っておいてください。

ソースコードは長いので、GitHubに専用のページを作ってそこに置くことにしました。(https://github.com/Umagame/TutorialGame/tree/main

今回は第5回なので、TutorialGame/5に今回作った2つのスクリプトをアップロードしています。

GitHubにWeb上から直接ファイルをアップロードしてるんですが、これGitHubの本来の使い方じゃないですよね...

まあ、スクリプトを共有できたらそれで良いです。

さいごに

今回はここまでです。

次回:

www.umagame.info

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #4 アニメーション / ダッシュ

はじめに

こんばんは。Unity2Dチュートリアル第4回です。

今回はアニメーションの追加と、ダッシュの実装を行います。

記事の長さ的に、ジャンプの着地判定(地面と接触しているときのみジャンプできるようにする設定)は次回に先延ばしします。

前回:

www.umagame.info

向き変更

まず、左右移動によるキャラクターの向きの変更を実装します。

早速コードを書きます。前回作ったPlayer.csのUpdate()の中に以下のコードを追加します。

そろそろコードが長くなってきたので、以降は変更部分のみを書いておくことにします。

//Player.cs

void Update()
{
    //Sprite Flip
    if (rb.velocity.x > 0)
    {
        GetComponent<SpriteRenderer>().flipX = false;
    }
    else if (rb.velocity.x < 0)
    {
        GetComponent<SpriteRenderer>().flipX = true;
    }
}

前回も使用したRigidbody2D.velocity.x(プレイヤーのX軸方向の速度)の正負によってプレイヤーの向きを変えています。

向きの変更は、GetComponent()でPlayerオブジェクトのSprite Rendererを取得し、そのflipXの真偽を変えることで出来ます。

これで向きが変わります。

勘の良い方ならお気づきかもしれませんが、ウマ娘は左右非対称なのでこの方法で向きを変えるには向いていません。

(本来はこっちからみて左側に赤いリボンの髪飾りがついていますが、左を向くと髪飾りが右に移動しています)

これは後ほど修正するとして、次はアニメーションを作ります。

アニメーション

テクスチャの追加・設定

Assets/Textures/Playerに新しく画像ファイルを追加します。

今回は移動(Run)・ジャンプ(Jump)・落下(Fall)・ダッシュ(Dash)用のスプライトを用意しました。

これは移動(Run)用のスプライトです。今回は32x32の画像を横に複数繋げたものをアニメーション用の画像として使っています。

前回と同様に、追加した画像ファイルの設定をしていきます。

「単位毎のピクセル数」を32に、「フィルターモード」を「ポイント」に、「圧縮」を「なし」にして、アニメーション用画像の場合は「スプライトモード」を「複数」にしておきます。

Sprite Editorで画像のスライスをするのも忘れないように。(やり方は第2回参照)

これで画像の準備は完了です。

アニメーションファイルの作成

アニメーションの設定ファイルを入れるためのフォルダを作ります。

作成→フォルダをクリック。

名前はAnimationsにします。

この中に、新しくアニメーションファイルを作ります。右クリック→作成→アニメーションをクリック。

アイドル状態(棒立ち)のアニメーションを作るので、名前は「Player_Idle」にします。

作成したファイルをダブルクリックすると、新しく「アニメーション」というウィンドウが表示されます。

ウィンドウ状態だと邪魔なので、ドラッグでゲームタブの横に置いておきます。

作成したアニメーションファイルをPlayerオブジェクトにドラッグアンドドロップします。

これでオブジェクトにアニメーションが適応され、「Player」という名前のアニメーターコントローラーが作成されます。(Player_Idleの左のやつ)

アニメーションを作っていきます。左画面(ヒエラルキー)でPlayerオブジェクトを選択した状態で、アニメーションタブのタイムラインにテクスチャをドラッグアンドドロップします。

今回Idle状態のテクスチャは一枚絵なので、これ以上設定することはありません。

同様にRun状態のアニメーションファイルも作ります。

Run状態はアニメーションのループが必要なので、アニメーションファイルのインスペクターから「時間をループ」にチェックを入れておきます。

Idleのやつと同様に、ドラッグアンドドロップでPlayerオブジェクトに適用しておきます。

複数枚のテクスチャを使う場合、このように分割された画像をすべて選択して(今回は8枚)ドラッグアンドドロップします。

その後、赤く囲ってある「サンプル」の数字を変えてアニメーション速度を変更します。今回は10にしました。(数字が小さいほど速度が遅くなります)

これでIdle状態とRun状態のアニメーションが完成しました。Jump・Fall状態は一旦置いておいて、次のステップへ移ります。

アニメーターの設定

オブジェクトのアニメーションを管理する「アニメーター」を開きます。メニュー→「ウィンドウ」→「アニメーション」→「アニメーター」をクリックします。

アニメーターが開いたら、「パラメーター」タブから新しくパラメーターを追加します。

パラメーター(Float, Int, Bool, Trigger型)を追加し、その値によってアニメーションがどう変わるかをアニメーター内で設定することによりアニメーションを実装します。(パラメーターの値はスクリプトから操作できます)

「+」ボタン→「Int」をクリックします。

名前は「state」にしておきます。

右画面から、アニメーション状態の間の遷移を作成します。Player_Idleを右クリック→「遷移を作成」をクリック。

その後Player_Runをクリックして遷移を作成します。

作成された矢印をクリックして、右の設定画面から「終了時間あり」のチェックを外し「遷移間隔」を0に設定します。

下にスクロールして「Conditions」の+ボタンをクリックし、state, Equals, 1の順に値を設定します。

これで「『state』が1になったとき、Player_Idle状態からPlayer_Run状態へ遷移する」という設定になりました。

今回はIdle状態を0、Run状態を1としているのでこのような形になります。

逆側の遷移も作ります。Player_Run→Player_Idleの矢印を作り、「終了時間あり」・「遷移間隔」の設定をして「Conditions」を上画像のようにします。

スクリプトの編集(Idle・Run間)

最後に、先程アニメーターで作った「state」というパラメーターをスクリプトで制御します。

//Player.cs
void Update()
    //Animation State
    if (rb.velocity.x != 0)
    {
        GetComponent<Animator>().SetInteger("state", 1);
    }
    else
    {
        GetComponent<Animator>().SetInteger("state", 0);
    }
}

Update()に上記のコードを追加します。

X軸方向の速度が0のときIdle状態(state=0)、そうでないときはRun状態(state=1)にするように設定しています。

これでIdle状態←→Run状態の遷移が行われます。

ジャンプ・落下アニメーション

次はジャンプ(Jump)・落下(Fall)状態のアニメーションを作っていきます。

Idle、Runと同様にアニメーションファイルを作り、Playerオブジェクトに適用しておきます。

今回はどちらもループしなくて良いので、アニメーションファイル自体の設定はデフォルトでOKです。

同様にアニメーションウィンドウでも設定を行います。

今回はFallのサンプル数を20にしておきました。Jump状態は一枚絵なので設定しなくて良いです。

Jump状態のstateを2、Fall状態のstateを3として、さっきと同じようにアニメーターで遷移を作成します。

量が増えるとめんどくさいですが、設定さえすればちゃんと動いてくれるので頑張りましょう。

stateを制御するコードも追加します。

//Player.cs
void Update()
{
    //上記で追加したコードを削除してこの一文を追加
    UpdateAnimationState();
}

private void UpdateAnimationState()
{
    //Run
    if (rb.velocity.x != 0)
    {
        GetComponent<Animator>().SetInteger("state", 1);
    }
    else
    {
        GetComponent<Animator>().SetInteger("state", 0);
    }

    //Jump / Fall
    if (rb.velocity.y > 0.1f)
    {
        GetComponent<Animator>().SetInteger("state", 2);
    }
    else if (rb.velocity.y < -0.1f)
    {
        GetComponent<Animator>().SetInteger("state", 3);
    }
}

Idle・Run間のアニメーション追加時に書き加えたコードを新しく作ったUpdateAnimationState()というメソッドに移し、さらにジャンプ・落下の判定をするコードも追加します。

ジャンプ・落下の判定は、Y軸方向の速度がある一定値(今回は0.1、-0.1)より大きいか小さいかを調べて行っています。

これを0より大きいか小さいかで判定すると、地面にいる状態でも常にジャンプor落下状態と判定されてしまいます。

おそらくY軸方向の速度については、一見Y座標が変わっていないように見えてもY軸速度が0ではないが0に限りなく近い値になっているのでしょうね。

これでジャンプしたときのアニメーションが実装できました。

ダッシュの実装

前回予告した通り、ダッシュを実装していきます。

まず、ダッシュのキー設定を入力マネージャーで行います。

デフォルトで作られていた「Fire1」という軸を「Dash」という名前に変えて、「left shift」をボタンとして設定します。

//Player.cs
public class Player : MonoBehaviour
{
    //2つの変数を追加
    public float DashSpeed = 6f;

    private bool isDashing = false;

    void Update()
    {
        //Player Movement
        if (!isDashing)
        {
            rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);
        }
        else
        {
            rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * DashSpeed, rb.velocity.y);
        }

        if (Input.GetButton("Dash"))
        {
            isDashing = true;
        }
        else
        {
            isDashing = false;
        }

        UpdateAnimationState();
    }

    private void UpdateAnimationState()
    {
        //Run
        if (rb.velocity.x != 0)
        {
            if (!isDashing)
            {
                GetComponent<Animator>().SetInteger("state", 1);
            }
            else
            {
                GetComponent<Animator>().SetInteger("state", 4);
            }
        }
        else
        {
            GetComponent<Animator>().SetInteger("state", 0);
        }
    }
}

DashSpeed(ダッシュ時の速度)とisDashing(ダッシュしているかどうか)という2つの変数を追加し、

Update()にダッシュの判定・ダッシュ時に速度を変更するコードを、UpdateAnimationState()にダッシュ時にstateを4にするコードを追加します。

そして他のアニメーションと同様にDash状態のアニメーションファイル(Player_Dash)を作成しPlayerオブジェクトに適用、アニメーターで他の状態との間の遷移を作成します。

ここで、Jump→Idle、Jump→Run、Jump→Dashの遷移を削除しておきます。

これを削除しないと、ジャンプの最高点ではY軸方向の速度が0に近くなるため空中でIdle, Run, Dashのいずれかのアニメーションが一瞬だけ再生されてしまいます。

これでダッシュの実装は完了です。

こんな感じになりました。

左向きテクスチャの追加・実装

先述の通り、テクスチャが左右非対称の場合に生じる不具合の解決をします。

多くの場合は左右対称だと思うので、やり方はそこまで詳しく説明しません。

まずこのような左向きの画像を用意して、

Unityに取り込みます。(スプライトの設定もします)

アニメーターで、Player_IdleからPlayer_DashをCtrl+C→Ctrl+Vでコピペします。(遷移の設定がめんどくさいので)

これだとただ単にコピーされているだけなので、左向きテクスチャを適用したアニメーションファイルを用意して、ドラッグアンドドロップで設定します。

インスペクター上部から名前も変えておきます。

右向きと左向きの間の遷移を作成します。左側で新しくBool型のパラメーター(今回はflipという名前)を作成し、遷移の設定を行います。

stateが0~4のうちのどの状態かの条件と、左向きかどうか(flip)の条件を設定します。

先述の通り、Jump→Idle、Jump→Run、Jump→Dashの遷移は必要ないので追加しないようにしましょう。

右向き→左向きの遷移と、左向き→右向きの遷移すべてを追加したらOKです。めちゃくちゃ面倒くさいです。何かもっと良い方法はないのか。

最後に、この記事の最初で編集した向き変更の部分を書き換えます。

void Update()
{
    //Sprite Flip
    if (rb.velocity.x > 0)
    {
        GetComponent<Animator>().SetBool("flip", false);
    }
    else if (rb.velocity.x < 0)
    {
        GetComponent<Animator>().SetBool("flip", true);
    }
}

これで左を向いたときにflipがtrueに、右を向いたときにflipがfalseになります。

そんなこんなで、左向き状態のアニメーションも追加できました。

今回の進捗 / ソースコード

最終的にこんな感じになりました。

意外と記事が長くなってしまったので、空中でジャンプが出来てしまう不具合の修正は次回にやることにします。

Player.csのソースコードはこちらです。(これ、スクリプトが多くなってくると直接貼るのきついので次回ぐらいからGitHubでの公開にしたほうが良いですね...)

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

public class Player : MonoBehaviour
{
    public float MoveSpeed = 3f;
    public float DashSpeed = 6f;
    public float JumpForce = 15f;

    private Rigidbody2D rb;

    private bool isDashing = false;

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

    void Update()
    {
        //Player Movement
        if (!isDashing)
        {
            rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);
        }
        else
        {
            rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * DashSpeed, rb.velocity.y);
        }

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
        }

        if (Input.GetButton("Dash"))
        {
            isDashing = true;
        }
        else
        {
            isDashing = false;
        }

        //Sprite Flip
        if(rb.velocity.x > 0)
        {
            GetComponent<Animator>().SetBool("flip", false);
        }
        else if (rb.velocity.x < 0)
        {
            GetComponent<Animator>().SetBool("flip", true);
        }

        UpdateAnimationState();
    }

    private void UpdateAnimationState()
    {
        //Run
        if (rb.velocity.x != 0)
        {
            if (!isDashing)
            {
                GetComponent<Animator>().SetInteger("state", 1);
            }
            else
            {
                GetComponent<Animator>().SetInteger("state", 4);
            }
        }
        else
        {
            GetComponent<Animator>().SetInteger("state", 0);
        }

        //Jump / Fall
        if(rb.velocity.y > 0.1f)
        {
            GetComponent<Animator>().SetInteger("state", 2);
        }
        else if(rb.velocity.y < -0.1f)
        {
            GetComponent<Animator>().SetInteger("state", 3);
        }
    }
}

さいごに

今回はここまでとなります。

次回は

  • 着地判定(ジャンプの修正)

  • カメラ移動(+マップ拡張)

  • デス判定(マップ外へ落ちたときの判定)

です。

www.umagame.info

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #3 プレイヤー / 左右移動・ジャンプ

はじめに

どうも。Unity2Dチュートリアル第3回です。

今回からC#スクリプトを書いていくので、記事内にソースコードを載せていきます。

本当は簡単にコピペできるようにコピーボタンを追加したかったのですが、HTMLとかCSSがさっぱりわからない私には無理でした。

申し訳ないですが、コピペする際は手動ですべて選択してコピーする必要があります。ご了承ください。

前回:

www.umagame.info

プレイヤーの作成

プレイヤーオブジェクトの作成

まず最初に、プレイヤーのオブジェクトを作ります。

新規に作成しても良いですが、前回作ったテスト用のオブジェクトを使って作ります。

前回作った「Square」というオブジェクトを右クリックして、「名前を変更」から名前を「Player」に変更します。

新規作成する場合は、シーン内を右クリック→「2Dオブジェクト」→「スプライト」→「正方形」で新しくオブジェクトを作成し、「Rigidbody 2D」と「Box Collider 2D」を追加すればOKです。

テクスチャの設定

新しくプレイヤーのテクスチャを用意します。Assets/Texturesに「Player」という名前のフォルダを作って、

用意したpngファイルをドラッグアンドドロップで追加します。

今回使う画像はこちらです。

32x32ピクセルキタサンブラックウマ娘)のドット絵です。頑張って作りました。

前回同様に、「単位毎のピクセル数」と「フィルターモード」と「圧縮」の設定を変更して「適用する」をクリックします。

今回は32x32の画像を使っているので、単位毎のピクセル数は32にしてあります。それ以外の2つは前回と同じです。

画像をオブジェクトに適用しましょう。

Playerオブジェクトのインスペクターで、「Sprite Renderer」の「スプライト」の所に画像をドラッグアンドドロップします。

これでオブジェクトの見た目が変わりました。

スクリプトの作成(左右移動)

プレイヤーの移動用スクリプトを書いていきます。

Assetsにスクリプト用のフォルダを作ります。名前はScriptsにしておきます。

Scriptsフォルダの中で右クリック→作成→C# スクリプトをクリック。

新しくスクリプトファイルが作られますので、名前を入力します。今回はPlayerにします。

これをダブルクリックすると、ソースコードエディタ(Visual Studio)が開きます。

これがVisual Studioの画面です。基本的にはスクリプトの編集と上書き保存しかしません。

Unityではスクリプトファイル作成時に、Start()とUpdate()というメソッドが追加されます。

Start()はこのスクリプトを適用したオブジェクトがシーン内に現れたときに呼び出され、Update()は毎フレーム呼び出されます。

早速コードを書きます。

//Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private Rigidbody2D rb;

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

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), rb.velocity.y);
    }
}

Player.csにはこのあとまたコードを書き足すので、これが完成形ではありません。(今回以降の記事では、記事の最後の方にまとめてソースコードを置いておきます。)

rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), rb.velocity.y);

↑この一文で、プレイヤーの左右移動を制御しています。

このあと説明する入力マネージャーの水平軸入力の値を、Rigidbody2DのvelocityのX値に代入することで左右移動を実装しています。

自身のRigidbody2Dは、StartメソッドでGetComponentを呼び出すことで取得しています。

ちなみに軸を取得する方法としてGetAxisとGetAxisRawがありますが、今回は-1か0か1の三種類で値が返ってくるGetAxisRawを使いました。

(GetAxisは3Dゲームのように、コントローラーのスティックの傾け具合によって移動速度が変わるようなゲームで使います)

先述の入力マネージャーの設定画面を開きます。上部メニューから、「編集」→「プロジェクト設定」をクリックして、

「入力マネージャー」タブを確認します。ここで、キーボード&マウスおよびコントローラーの入力設定を行えます。

赤く囲ってある「水平」(Horizontal)が水平軸です。これはプロジェクト作成時に最初からUnity側で設定されています。

見て分かる通り十字キーの左 / 右キーとWASDのA / Dキーが割り当てられているので、キーボード操作の場合はこれらのキーで操作出来ます。

もちろん、割り当てるキーをこの画面から変更することも出来ます。

今後コントローラー操作にも対応させる予定なので、入力マネージャーを使った操作を実装しています。

スクリプトの適用

作ったスクリプトをオブジェクトに適応します。Player.csをドラッグして、Playerオブジェクトのインスペクターにドロップします。

これでテストプレイを開始し、AまたはDキーを押すと左右移動します。

オブジェクトの回転が有効になっているので、なにかに引っかかるとこのように向きが変わってしまいます。

これを修正するために、プレイヤーのRigidbody2Dの「Constraints」のZにチェックを入れます。これで回転しなくなります。

少し移動が遅いので、移動速度を自由に調整できるようにしましょう。

(下記のコードは一番上のusingを省略しています)

//Player.cs
public class Player : MonoBehaviour
{
    public float MoveSpeed = 5f;

    private Rigidbody2D rb;

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

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);
    }
}

float型のMoveSpeedという変数を用意して、Horizontal軸の値に掛けています。

MoveSpeedをpublic変数にすることで、このようにインスペクターから直接変数の値を変更することが出来ます。

これはテストプレイ中も変更することができるので、移動速度を調整する際に便利です。

今回はMoveSpeedを3にしておきました。

ジャンプの実装

Player.csに書き足して、ジャンプも実装しましょう。

//Player.cs
public class Player : MonoBehaviour
{
    public float MoveSpeed = 3f;
    public float JumpForce = 15f;

    private Rigidbody2D rb;

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

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
        }
    }
}

左右移動と同じように、RigidBody2D.velocityのY値を変えることでジャンプを実装しています。

float型のJumpForceという変数を作って、これをジャンプ力としています。

ジャンプボタンが押されたかどうかの判定はInput.GetButtonDownで行います。

この"Jump"は入力マネージャーの「Jump」軸のことで、これも最初から作成されています。デフォルトでSpaceキーが設定されています。

ちなみに、直接キーボード入力を取得する場合は、

Input.GetButtonDown("Jump")

Input.GetKeyDown(KeyCode.Space)

のように書き換えます。

値の調整

最終的にMoveSpeedを3に、JumpForceを15にして、

Rigidbody2Dの「重力スケール」を4にしました。これで2Dマリオと似た操作感になりました。

そして、Rigidbody2Dの「衝突判定」を「連続的」に変更しておきます。これが「非連続的」のままだと、地面に着地した際に少しキャラクターがめり込みます。

キャラクターの当たり判定も変更します。「Box Collider 2D」の「コライダーの編集」をクリックして、

キャラクターの大きさに合うように緑の枠の大きさを変更します。実際の大きさより少し小さめにするといい感じです。

今回の進捗 / ソースコード

(動画に音声はありません)

今回はキャラクターの追加と左右移動 / ジャンプ機能を実装しました。

ジャンプはキーを押したときにいつでもできるようにしてあるので、今の状態だと空中でもジャンプできてしまいます。これは次回に修正します。

また左右移動の移動速度が遅いですが、これも次回ダッシュ機能を実装する予定なので遅めに設定してあります。

今回作成したPlayer.csのソースコードはこちらです。

using UnityEngine;
public class Player : MonoBehaviour
{
    public float MoveSpeed = 3f;
    public float JumpForce = 15f;

    private Rigidbody2D rb;

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

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
        }
    }
}

さいごに

今回は以上となります。

次回は、

  • 空中でジャンプができないように修正(これは第5回にやります)

  • プレイヤーの向きが変わるように設定

  • ダッシュの実装

です。

次回:

www.umagame.info

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #2 タイルマップ

はじめに

どうも。

前回に引き続き、Unityの2Dアクションゲーム制作チュートリアルをやっていきます。

今回はマップを作っていきます。

前回同様、タイトルにソースコードコピペ可能!と書いてありますが実際にコードを書くのは第3回以降です。

前回:

www.umagame.info

エディタの使い方

まず、軽くUnityのエディタの使い方を説明します。

もしかしたら皆さんの環境とはコンポーネントの位置が違うかもしれません。

①・・・ここでシーンのオブジェクト(カメラ、プレイヤーなど)の管理ができます。

②・・・シーンのオブジェクトを編集するときはこの「シーン」タブで行います。

③・・・テストプレイ中や、ゲーム内でシーンがどのように見えているかを確認する際は「ゲーム」タブを開きます。

④・・・インスペクターといいます。オブジェクトやアセット(画像ファイルなど)の詳細設定を行えます。

⑤・・・「プロジェクト」タブでアセットの管理を行えます。

初めてUnityを触る方は見慣れない単語があるかもしれませんが、それぞれの単語の解説は割愛します。すみません。

マップの作成

テクスチャのインポート

まず、マップを構成するブロックのテクスチャをUnityに取り入れます。

あ、その前に「ゲーム」タブの「Free Aspect」の部分を「Full HD(1920x1080)」に変更しておきます。

これで、ゲームの画面サイズがフルHDになりました。

それではやっていきましょう。

まず、画面下のプロジェクトタブでAssetsというフォルダの中に新しくフォルダを作ります。

右クリック→作成→フォルダーをクリックします。

名前は「Textures」にしておきました。

今から追加するのはマップ用のテクスチャなので、Texturesの中にさらに「Tiles」というフォルダも作っておきます。

エクスプローラーでテクスチャの画像をドラッグアンドドロップで追加します。

今回使用する画像を下に貼っておきます。マイクラで言う草ブロックと土ブロック、そして背景の空色(いずれも16x16ピクセル)が入った画像です。

こんな感じになればOKです。

ちなみに、この手順は直接Unityプロジェクトのディレクトリをいじることでも出来ます。

今回の場合はUnityプロジェクトをC:\work\unityに作成したので、C:\work\unity\TutorialGame\Assetsに新しくTexturesフォルダを作り、その中に作ったTilesフォルダにpngファイルを入れればOKです。

テクスチャの設定

取り込んだ画像ファイルの設定を行っていきます。

pngファイルを下画面(プロジェクトタブ)でクリックすると、インスペクターに色々と表示されます。

ここで「スプライトモード」を「複数」に、「単位毎のピクセル数」を「16」に設定して「Sprite Editor」をクリックします。

Sprite Editorが開いたら、左上の「スライス」ボタン→「タイプ」を「Grid By Cell Size」に設定して、

ピクセルサイズ」をX16, Y16にして「スライス」をクリックします。

このとき、ちゃんとブロックが赤い枠で区切られていることを確認してください。

スライスしたら、右上の「適用する」をクリックしてSprite Editorを閉じます。

ここで、Sprite Editorで画像を開いたときに画質が悪い(ぼやけている)状態になっていたと思いますが、これはエディタの仕様ではなく、実際にUnity側でぼやけた画像が認識されてしまっています。

それを直すために、インスペクターの「フィルターモード」を「ポイント(フィルターなし)」に、「圧縮」を「なし」に設定して「適用する」をクリックします。

こんな感じになっていればOKです。

今の手順で、一枚の画像から三枚の画像を抽出(切り取り)することができました。

タイルマップの作成

では、マップを作っていきます。

まず、シーンにタイルマップ(Tilemap)を追加します。シーン下で右クリック→「2Dオブジェクト」→「タイルマップ」→「矩形」をクリック。

タイルマップの名前は「Terrain」(地形)にしておきます。

次に、画面上部メニューから「ウィンドウ」→「2D」→「タイルパレット」をクリック。タイルパレットのウィンドウが開きます。

今回は上画像のように、タイルパレットをインスペクターの横にドラッグして置いておきます。

「有効なパレットがありません」→「Create New Palette」をクリックします。

名前を設定して「作成」をクリックします。こちらも名前はTerrainにしています。

新しいウィンドウが開くので、パレットを保存するフォルダを指定します。

今回は、Assetsの中に「Palettes」というフォルダを作ってそれを指定しました。(おそらくパレットは一つしか使いませんが、一応こうしておきます)

作れたら、画像をドラッグアンドドロップでパレットに追加します。

またウィンドウが開きます。今回はタイルのファイルを保存するフォルダを指定するので、同様に「Tiles」というフォルダを作って指定しました。

こんな感じで、それぞれのブロックがグリッドと同じサイズで表示されていたらOKです。

赤く囲ってあるブラシツールを選択して、マップを作っていきます。

こんな感じで、マリオメーカーみたいにシーンにブロックを追加することが出来ます。

これはTerrain(地形)なので、プレイヤーと当たり判定があるブロックだけを追加しました。

次に、背景用のタイルマップも作成します。同様に「Grid」を右クリック→「2Dオブジェクト」→「タイルマップ」→「矩形」をクリックします。

名前は「Background」にしました。

タイルパレットで「Background」を選択してから、背景を塗っていきます。赤く囲ってあるツールを使うと楽です。

当たり判定の設定

次は当たり判定の設定を行います。

Terrainのタイルマップを選択した状態で、「インスペクター」の「コンポーネントを追加」をクリックします。

「Tilemap Collider 2D」を検索してクリックします。

これはタイルマップ用のCollider(当たり判定を作るコンポーネント)です。

これだけで一応タイルマップの当たり判定は作れていますが、もう少しだけ設定が必要です。

新しく「Composite Collider 2D」をTerrainタイルマップに追加します。

追加すると、Composite Collider 2DだけでなくRigidbody 2Dというコンポーネントも追加されます。

「Tilemap Collider 2D」の、「複合で使用」にチェックを入れて、

「Rigidbody 2D」の「ボディタイプ」を「静的」にします。これで設定は完了です。

このComposite Colliderを使わないと、ブロックの上のプレイヤーの動作がうまく行われません。(ブロックの間で引っかかったりします)

ちゃんと当たり判定が作れているか確認するために、テスト用のオブジェクトを作成します。

「2Dオブジェクト」→「スプライト」→「正方形」をクリックします。名前は何でも良いです。

どうやら今追加したオブジェクトが背景の後ろに隠れているようなので、先にこれを修正します。

Backgroundのタイルマップのインスペクターで、「Tilemap Renderer」というコンポーネントの「ソートレイヤー」の設定を変えます。

「Add Sorting Layer...」をクリックします。

するとレイヤー設定画面が表示されるので、「ソートレイヤー」のプラスボタンをクリックして「Background」という名前のレイヤーを作成します。

上のレイヤーほど後ろに配置されるようになっているので、DefaultよりBackgroundが上になるように設定してください。

Backgroundのタイルマップのインスペクターに戻って、「ソートレイヤー」を今作ったBackgroundにするとこのように白い正方形が表示されます。

では、正方形のオブジェクトにも当たり判定を追加していきます。

正方形(Square)のインスペクターから、「コンポーネントを追加」→「Rigidbody 2D」をクリックします。

ちなみに名前に「2D」とついていない、「Rigidbody」というコンポーネントは3Dゲーム用のものなので、これは追加しないようにしてください。

Rigidbodyはオブジェクトに重力を追加し、物理演算によってオブジェクトを動かす事ができるようにするコンポーネントです。

「Box Collider 2D」というコンポーネントも追加します。これは当たり判定が長方形のColliderです。

特に設定は必要ないので追加するだけで良いです。

画面上部の三角ボタンを押してテストプレイを開始しましょう。

そうすると「ゲーム」タブに移動し、白い正方形が地面まで落下する様子が観察できると思います。

これで、マップとその当たり判定の設定は完了です。お疲れ様でした。

さいごに

今回はここまでとなります。

次回はついにプレイヤーを追加します。C#でのプログラミングも次回から始まります。

次回:

www.umagame.info

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #1 環境構築

はじめに

お久しぶりです。

更新サボってすみませんでした。別にそこまで忙しかったわけではありませんが、なんかやる気が起きませんでした。

 

今回からUnityでのゲーム開発チュートリアルを始めようと思います。今回のシリーズでは2Dアクションゲーム(マリオみたいなプラットフォームゲーム)を作っていきます。

(今後別ジャンルのゲームや3Dゲームについてもやるかもしれませんが、未定です。やる気があればやります。)

あと、タイトルにソースコードコピペ可能!と書いてありますが実際にコードを書くのは第3回以降です。

Unityでのゲーム制作に必要なもの

まず、Unityでのゲーム制作に必要なものについて紹介します。

といってもUnityは無料なので、特別必要なものはありません。

パソコン

Unityはパソコン用のアプリケーションなので、もちろんパソコンが必要です。

Unity公式サイトに記載してあるスペック要件がこれです。基本、64bitのパソコンであれば動くと考えてもらって良いです。

CPU・GPUなどのスペックは高いほど良いですが、ハイスペックでなくても問題ないです。(特に、今回のシリーズでは2Dゲームを扱うので比較的動作は軽いです)

まあ、よほどパソコンが古かったり値段が安すぎたりしない限り動きます。

プログラミングの知識

UnityはC#プログラミング言語として使うので、ある程度のプログラミングの知識は必要です。

一応このシリーズでは、ソースコードのコピペ+Unityエディタでの操作でゲームを作れるようにしてありますが、ゲーム制作の面白い所は自分が作りたいゲームを作れるということなので、ある程度の知識があったほうが自由度が高いです。

どれぐらいの知識が要求されるかは作りたいゲームによりますが、目安としては、繰り返し処理・配列・オブジェクト指向の基本(static有りと無しの違いなど)が分かっていれば十分だと思います。

そのレベルに達していなくても、Unityを通じてプログラミングを勉強していけば問題ないです。

その他

上記の2つ以外に任意で必要なものもあります。

  • パソコンに接続できるゲームパッド(コントローラー対応ゲームを作る場合)
  • ソースコードエディタ(Unityインストール時にVisual Studioもインストールされるのでそれで十分ですが、こだわりのある方は他に用意できます)

Unity Hubのインストール

まず、Unity Hubのインストールを行います。

Unity Hubは、Unityプロジェクトの管理やUnityのソフト(エディター)自体のインストールのためのアプリです。

Unity公式サイトからダウンロードします。

ダウンロードをクリック。

Windows用ダウンロードをクリックするとインストーラーがダウンロードされますので、それを起動してインストールします。

インストーラー上の設定なども特にないので、そのまま指示に従ってインストールしてください。

Unityのインストール

Unity Hubをインストールできたら、起動します。

ログインが求められるので、アカウントを持っている方は「Sign in」、持っていない方は「Create account」をクリックします。

いずれかをクリックするとブラウザが開きます。そこからアカウントの作成もしくはログインをしてください。

ログインが終わると、Unity本体(エディター)のインストールをするよう言われますので、「Install Unity Editor」をクリックします。

上のスクショはバージョン「2022.3.14f1」になっていますが、今回のシリーズでは私が過去にインストールした「2022.3.7f1」というバージョンを使っていきますのでご了承ください。

(特にこだわりがなければ最新バージョンで良いです)

インストールが始まります。しばらく待ちましょう。

インストールが終わったら、プロジェクトを作る前に日本語化をしておきます。しなくても良いです。

「Installs」タブでさっきインストールしたバージョンの歯車アイコンから、「Add modules」をクリックします。

モジュール選択画面が表示されます。こちらでは言語パックの他に、AndroidiOS用の開発をするためのモジュールもインストールできます。

下へスクロールして、LANGUAGE PACKSの日本語にチェックをいれて右下の「Install」をクリックします。(上画像はインストール済みの画像です)

言語設定はUnityの起動後に行えるので、一旦次のステップへ進みましょう。

プロジェクトの作成

早速プロジェクトを作っていきます。画面右上の「New project」をクリックします。

前述の通り、今回のシリーズでは2Dアクションゲームを作るので「2D Core」を選択します。

「2D (URP)」の方は拡張的な機能がついているやつなので無視して良いです。

(URPはゲームのビジュアルを更に洗練させるために使う機能?私も詳しくないですが、少なくとも今回のシリーズで作るようなゲームでは必要ないです)

そして「Project name」にゲームの名前を、「Location」にゲームのデータを保管するディレクトリを入力します。

今回ではそれぞれ「TutorialGame」、「C:\work\unity」としておきました。

そしてその下の「Connect to Unity Cloud」は、デフォルトでチェックが入っていたので入れておきました。

(Unity Cloudもよくわかりません!チェック入れなくても良いです)

「Create project」をクリックでプロジェクトの作成が始まります。

しばらく待つと、Unityのエディターが起動します。

Edit→Preferencesから設定を開いて、

Languagesタブの「Editor language」を日本語に設定します。

その後一旦エディターを閉じて、Unity Hubから再びプロジェクトを開くとエディターが日本語化されます。

これで開発環境の構築は完了です。お疲れ様でした。

さいごに

今回はここまでとなります。

次回からゲーム制作を始めていきます。

次回:

www.umagame.info

【VALORANT】ブリーズのソーヴァを極めよう!パッチ7.04以降のブリーズにおけるリコンボルト・ショックダーツ定点まとめ【ヴァロラント】

はじめに

どうも。

先日(結構前ですが)のアプデでマッププールにブリーズが追加されましたね。

今回は、マップ変更が加えられて復活したブリーズにおける、ソーヴァのリコンボルトやショックダーツの定点を紹介します。

参考になれば幸いです。

例により、リコンボルト・ショックダーツのチャージの度合いは上のように0,1,2,フルチャージと表すこととします。

リコンボルトの定点

攻め・守り両方におけるリコンボルトの定点を紹介します。

守り

A ショップ

ここの角に立って、

赤く囲ってある所へエイムしてフルチャージ1バウンスで撃ちます。

ここに刺さります。開幕時Aに敵がいるかを確認することができます。

ネスト→ミッド

ここの角に立って、

背景の壁の穴の下端にエイムして、フルチャージ1バウンスで撃ちます。

ここに刺さります。

ネスト→B

ここの角に立って、

赤く囲ってある、青線の中央あたりにエイムして1チャージ0バウンスで撃ちます。

ここに刺さります。

A→Bサイト内

ここの角に立って、

赤く囲ってある背景の突起部分に、

バウンスの左側の四角形の右をあわせて、2チャージ0バウンスで撃ちます。

ここに刺さります。AからBへローテートする際に使えます。

攻め

A ロビー→Aサイト内

ここの小さな箱の前に立って、

チャージのUIの白線を、赤く囲ってある背景の葉っぱに合わせて2チャージ0バウンスで撃ちます。

ここに刺さります。

A ショップ→Aサイト内

ここの角に立って、

赤く囲ってある所あたりにエイムしてフルチャージ1バウンスで撃ちます。

ここに刺さります。

A ロビー→Aイエロー裏

ここの角に立って、

赤く囲ってある葉っぱの部分に、

ドローンのアイコンの中央の部分をあわせて2チャージ0バウンスで撃ちます。

黄色のコンテナの所に刺さります。

Bサイト内1

ここの角に立って、

背景の塔の白い三角形(青く囲ってあるやつ)の左下の角にエイムして、フルチャージ1バウンスで撃ちます。

ここに刺さります。

Bサイト内2

ここの壁の真ん中に立って、

赤く囲ってある所を、

ドローンのアイコンの下端に合わせて、2チャージ0バウンスで撃ちます。

ここに刺さります。

A ロビー→Bサイト内

フェイク用のリコンボルトです。

ここの角に立って、

青く囲ってある葉っぱを基準にして上のスクショのようにエイムします。

そのまま、フルチャージ2バウンスで撃ちます。

成功するとここに刺さります。失敗しても、Bサイト内のどこかには刺さるのでフェイクには役立ちます。

ショックダーツの定点

アタッカーでスパイク解除阻止をする際に使えるショックダーツの定点を紹介します。

A

ここの角に立って、

背景のドアの張り紙の中央にエイムして、フルチャージ1バウンスで撃ちます。

ここに着弾します。

B

ここの壁に張り付いて後ろを向き、

青線を基準にして赤く囲ってあるところにエイムして、フルチャージ1バウンスで撃ちます。

ここに着弾します。

さいごに

今回は以上となります。

Bサイト側はAサイトに比べてマップ変更が少ないので、昔の定点がそのまま使えたりもします。

例えば去年の記事↓で紹介したブリーズのダブルショックダーツなどはそのまま使えます。(露骨な宣伝)

www.umagame.info