20210906のUnityに関する記事は3件です。

オンラインゲームの作り方【Unity+Mirror】

オンラインゲームを作りたい!でも作り方がわからない...という方はよくいると思いますが、 今回はそういう方に向けて Unity+Mirrorでのオンラインゲーム制作のやり方を記載していきたいと思います。 【目次】 事前準備について Unityって? Mirrorって? オンラインゲームの実際の作り方(基盤作りまで) 事前準備は何が必要なの? 今回推奨するのはUnity+Unity内のアセット(追加パッチみたいなもの)「Mirror」だけで作れるよ! Unityの公式ダウンロードサイトはここだよ! Unityは複数Versionを所有していてVersion違いでバグが発生する可能性があるからUnityHubっていう 複数のバージョンのダウンロード&管理や切り替えが出来るツールの方をダウンロードしてね! その後はとりあえずUnity公式が推奨する安定版のVersionを使用すればいいと思うよ! 参考にしているサイトとか動画がある場合に最新版を使って、 エラーが出るなら参考のバージョンに合わした方がいいかも? まずUnityって? Unityっていうのはゲームエンジンといって、 ゲーム制作をする際に最低限の色々な機能を持った空間を用意してくれているものだよ! 初期画面としてはこんな感じだよ!この空間に色々物体を置いたりして調整してゲームを作るんだ! ゲームエンジンとしてはこのUnityとUE4(Unreal Engine4)というのが二大巨頭になっているんだけど... どちらかというとUnityは汎用的ゲーム制作に使えて UE4は本格3Dゲーム制作を作るのに適しているっていうのが通例だね! といってもシェアを厳密に分割するとUnityの方が多く使われているからUnityを採用するよ! Mirrorって? MirrorはUnity内で追加出来るアセットで、 これをUnity内にいれるだけで大体オンライン通信が出来る環境の基盤が出来るよ! 更に内容物に手を少し手を加えるだけで 色んなカスタムも出来るからかなり時短になるありがたいアセットだよ! オンラインゲームの実際の作り方(基盤作りまで) さて、早速本題に入っていくよ! まずUnityhubをダウンロードしてMirrorをインポートしていくよ! 詳しいやり方について、 本当に初心者向け(実際に初期ダウンロードから始めてるよ)に、 自分が実際に動画で解説したものがあるから字でわからない人はこっちを見てね! ■【基礎編】Unityオンラインゲーム作り方解説動画!【Unity初心者向け】 ※将来的に色んなジャンルでの  オンラインゲーム制作の動画を上げていく予定だからチャンネル登録よろしくね! Unity上の操作 インポートが終わったら、ヒエラレルキー右クリックから「空のオブジェクト」を作成して、 それを「NetworkManger」って名前にしてネットワークを管理するオブジェクトとして設定するよ! 「ネットワークマネージャ」に「ネットワークHUB」を追加してね! この段階で実行すると、もうネットワークに接続できる状態になってるよ!とても簡単だね! でもまだこの段階じゃ何も設定してないから何も出るはずはなく... 最初にプレイヤーはどのゲームにもいるはずだからプレイヤーを出現させていくよ! ヒエラルキーから右クリックで仮にプレイヤーを作っていくよ! 「3Dオブジェクト」→「スフィア」で名前を「Player」に設定するよ! それをネットワーク空間に適応させるためにコンポーネント「NetworkTransform」を追加! それからプレハブ化だよ! そしたら「NetworkManger」の「プレイヤープレハブ」にその「Player」を追加してね! すると、実行した時にHost又はClientで接続した時に設定したプレイヤーが表示されるはずだよ! 確認方法としては、 二人プレイヤーがいるからUnity上の実行+ビルドした実際のゲームで見比べていくよ! ビルドしたゲームとUnity上で接続して確認してみてね! ...とこの段階ではまだプレイヤーが一つ召喚されたようにしか見えないんだ! なぜならプレイヤーは二つ確かに出てるんだけど 当たり判定も設定してないから完全に同じ座標に表示されてるんだよね... 対策としてプレイヤーに リジッドボディコンポーネント(当たり判定とか重力とか付属させるコンポーネント)を追加すると、 区別がつくようになると思うよ! 以上でオンラインゲーム制作の基礎の基礎は終わりだよ! これからどんなゲームを作りたいかによって作り方を色々変えていってね! 自分チャンネルで将来的に【FPS】【2Dスクロールゲーム】を作れるようになるまで動画を用意するつもりだよ! (現段階はFPS編が途中まで公開されているよ!) 他につくってほしいゲームジャンルとかがあったら気軽にyoutubeでコメントしてみてね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VFXGraphにGraphicsBufferから値を渡す

やること VFXGraphに対してGraphicsBufferを介して値を渡す。 VFXGraphに複数の値を渡すには一旦テクスチャにベイクする必要があったが、 バージョン12からGraphicsBufferがサポートされているので試してみる。 GraphicsBufferに対して値を渡すのにComputeShaderを使う方法とC#スクリプトを使う方法をトライする。 参考文献 ComputeShaderを使う方法 参考文献を更に簡略化しただけですが ComputeShader #pragma kernel WaveAnimation float Time; RWStructuredBuffer<float3> PointBuffer; [numthreads(4,4,1)] void WaveAnimation (uint2 id : SV_DispatchThreadID) { float z = sin(id.x * 0.5 - Time * 2) *id.y* 0.5; uint index = id.x + id.y * 16; PointBuffer[index] = float3(id.x, id.y, z); } C# using UnityEngine; using UnityEngine.VFX; public class WaveAnimation : MonoBehaviour { [SerializeField] ComputeShader ComputeShader; GraphicsBuffer GraphicsBuffer; int kernel; private void Start() { GraphicsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, 16 * 16, 3 * sizeof(float)); GetComponent<VisualEffect>().SetGraphicsBuffer("TestBuffer", GraphicsBuffer); kernel = ComputeShader.FindKernel("WaveAnimation"); } private void Update() { ComputeShader.SetFloat("Time", Time.time); ComputeShader.SetBuffer(kernel, "PointBuffer", GraphicsBuffer); ComputeShader.Dispatch(kernel,4, 4, 1); } private void OnDestroy() { GraphicsBuffer.Release(); } } VFXGraph 結果 軽く解説1 ComputeShaderに関しては自分もしっかりとは理解できていないのですが、idというVector2を与えた時その値と時間に応じたZの値を計算させています。 https://edom18.hateblo.jp/entry/2017/05/10/083421 https://edom18.hateblo.jp/entry/2017/10/07/171147 このサイトが参考になりました。 C#の方はStartでGraphicsBufferを作成しVisualEffectのプロパティに渡しています。 Updateで現在時刻をcomputeshaderに渡して計算の命令を出しているようです。 基本的にはComputeBufferの上位互換?みたいなので、ComputeBufferが分かっている人ならすんなり使えると思われます。 https://qiita.com/IKD-Member/items/f424b3e53a6482cab884 この記事も参考になりました。 C#スクリプトを使う方法 自分が前書いたテクスチャにベイクして渡す方法のサンプルを改造していきます。 https://qiita.com/rasashi1/items/9b44957d41fad8355f2b グラフ vfx側のスクリプト using UnityEngine; using UnityEngine.VFX; public class MagicOrb : MonoBehaviour { VisualEffect vfx; GraphicsBuffer GraphicsBuffer; //Orbの状態を表す  //0:緑色 1:赤色 2:青色 int[] orbState = new int[9]; public int[] OrbState { get { return orbState; } set { orbState = value; } } private void Start() { vfx = GetComponent<VisualEffect>(); GraphicsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, 9, sizeof(int)); vfx.SetGraphicsBuffer("TestBuffer", GraphicsBuffer); SetData2Buffer(); } public void SetData2Buffer() { GraphicsBuffer.SetData(orbState); } } キューブ側のスクリプト using UnityEngine; public class OrbInteractor : MonoBehaviour { [SerializeField] bool left = false; [SerializeField] MagicOrb magicOrb; bool change = false; private void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Orb")) { //object名の数字部分を切り出す string name = other.gameObject.name; int num = int.Parse(name.Substring(4)); change = false; if (left && magicOrb.OrbState[num] != 2) { magicOrb.OrbState[num] = 2; change = true; } else if (!left&&magicOrb.OrbState[num] != 1) { magicOrb.OrbState[num] = 1; change = true; } if (change) { //magicOrb.SetMap2VFX(); magicOrb.SetData2Buffer(); } } } } かなりシンプルになりましたね。 もっと大量のデータを渡すパターンも試してみたいところですが一旦これで完了で...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityの物理エンジンを使ってブロック崩しを作ってみた

作るもの Unityをつかってブロック崩しを作成する。 仕様は以下の通り。 プログラム実行と同時にボールが右上に向かって発射 バーはキーボード矢印で操作。(面白そうなので上下にも動くようにする) ボールがバーより下の壁に当たると壁が消える ボールが、消えた壁の上を通過するとゲームオーバー ブロックに当たるとブロックが消える(ブロックは6つ) ブロックをすべて消してもクリア画面等は用意しない 開発環境 Unity 2020.3.2f1 Visual Studio Code 1.55.0 開発スタート 1.ブロック崩しに必要なものを配置 床、壁、ボールなどのブロック崩しに必要なオブジェクトを画面に配置する。 追加は画面上部のバーから「アセット」>「作成」を選択して行う いろいろなアセットがありますが、今回配置するオブジェクトに使うのは「マテリアル」のみ! ↓マテリアルを追加するとボール状のものがプロジェクトに追加されます 2.ボールに物理演算(物理エンジン)を付与する Unityには様々な物理演算機能が用意されています 今回はその中でも Rigidbody (重力付与及び動作制御) Sphere Collider (球体の衝突に関する設定) Rigidbodyの追加 「コンポーネント>物理>リジットボディ」からプロパティを追加します 今回Y軸(高さ)方向に動いてほしくないので、Constraintsの位置を固定にてYをチェックします。 また、回転も特に必要ないのですべてにチェックをします。 Sphere Colliderの追加 「アセット>作成>物理マテリアル」からプロジェクトにアセットを追加します ↓こんなアセットが追加されます。 ボールは等速でシンプルな動作をしてほしいので。 摩擦ゼロ 物体に当たったら跳ね返る 設定をします。 プロパティー説明 プロパティー 機能 Dynamic Friction 移動している物体に対する摩擦。通常は、0 から 1 の間の値を使用します。0 の場合、氷のような感じになります。1 の場合、強い力や重力がオブジェクトを押さない限り、すぐに止まります。 Static Friction 面上で静止しているオブジェクトに使用される摩擦。通常は、0 から 1 の間の値を使用します。0 の場合、氷のような感じになります。1 の場合、強い力を加えないとオブジェクトは動きません。 Bounciness 表面にどれだけ弾性があるか。0 の場合は弾性がありません。1 の場合はエネルギーが減ることなく跳ねます。シミュレーションには少量のエネルギーを加えるかもしれませんが、ある程度の近似が予想されます。 Friction Combine 衝突するオブジェクト間の摩擦をどう処理するか。 Bounce Combine 衝突するオブジェクト間の跳ね返し度合いをどう処理するか。Friction Combineと同じです。 以上の設定が完了したら、この物理マテリアルをボールの「Sphere Collider」に設定します。(マテリアルに設定した物理マテリアル名が表示されればOK) 3.スクリプトでものを動かす 物理エンジンでボールの動きは設定できたので、後は下記の動きをスクリプトで実装します。 ①ゲームスタートでボールを右上に発射 ②キーボードでバーを操作 ③ボールがブロックにあたったらブロックを消す ④(おまけ)ボールが、バーより下を2回通過するとゲームオーバーの文字を表示 ①④ using System.Collections; using System.Collections.Generic; using UnityEngine; public class ball : MonoBehaviour { public float speed = 1.0f; private Rigidbody myRigid; private bool OutFlg = false; public GameObject lightObj; public GameObject gameOverObj; light script; //UnityChanScriptが入る変数 // ゲームスタートでボールを右上に発射 void Start () { myRigid = this.GetComponent<Rigidbody>(); myRigid.AddForce((transform.forward + transform.right) * speed, ForceMode.VelocityChange); } // (おまけ)ボールが、バーより下を2回通過するとゲームオーバーの文字を表示 void Update() { if (this.transform.position.z < -7 && !OutFlg){ OutFlg = true; lightObj.GetComponent<light>().removeLight(); Rigidbody rd; rd = gameOverObj.GetComponent<Rigidbody>(); rd.useGravity = true; Destroy(this.gameObject); } } } ② using System.Collections; using System.Collections.Generic; using UnityEngine; public class player : MonoBehaviour { public float speed = 1.0f; // Start is called before the first frame update void Start() { } // キーボードでバーを操作 void Update() { if (Input.GetKey(KeyCode.LeftArrow)){ if(this.transform.position.x > -4) this.transform.position += Vector3.left * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.RightArrow)){ if(this.transform.position.x < 4) this.transform.position += Vector3.right * speed * Time.deltaTime; } if(Input.GetKey(KeyCode.UpArrow)){ if(this.transform.position.z < 5.5) this.transform.position += Vector3.forward * speed * Time.deltaTime; } if(Input.GetKey(KeyCode.DownArrow)){ if(this.transform.position.z > -5.5) this.transform.position += Vector3.back * speed * Time.deltaTime; } } } ③ using System.Collections; using System.Collections.Generic; using UnityEngine; public class block : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } // ボールがブロックにあたったらブロックを消す private void OnCollisionEnter(Collision collision){ Destroy(this.gameObject); } } 以上で完成です 出来上がったものがこちら
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む