Uniblo-ゆにブロ- Unity初心者がマルチプレイオンラインゲームを作るブログ Wed, 03 Jan 2018 19:02:07 +0000 ja hourly 1 https://wordpress.org/?v=6.0.2 今年最後のゲーム「UTC FPS ONLINE」を投稿しました!! /unity/utcfpsonline?utm_source=rss&utm_medium=rss&%23038;utm_campaign=utcfpsonline /unity/utcfpsonline#respond Sun, 31 Dec 2017 13:55:43 +0000 /?p=706 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

今年もあと残すところ1時間程度となりました。

今年最後の製作としてunityroom用にもう一つゲームをアップロードしました!!

その名も UTC FPS ONLINE !!

FPSは作り慣れていないせいで、カメラの位置や攻撃の制御に苦戦しましたが、なんとか完成しました…^^;

今回はオンラインFPSゲームで、前回のSUPER SMASH UTCs.のように吹っ飛ばし合うゲームです。

ダメージが多くなると吹っ飛びやすくなります。HPが0になっても死にません。

フィールドの外に飛ばされて落ちると死にます。

良かったら一度お友達とプレイしてみてください!

以下、利用させていただいたAssetと、ゲームのどこに利用させていただいたかの説明になります。

利用させていただいたAssetたち

Game Jam Menu Template

皆勤賞。簡単にタイトルのシーンを作成できるAssetです。

Prefabのドロップ&ドロップで簡易タイトルシーンを設定できます。

 

Photon Unity Networking Free

こちらも皆勤賞。

オンラインゲームを作成するためのAssetです。

このブログでは使い方を紹介しています。いつも大変お世話になっております。

Optimize, SD Kohaku-Chanz!


SDこはくちゃんとその仲間達のモデルが入っているAssetです。

今回もこはくちゃんをプレイヤーキャラとして採用しました。

やっぱりかわいい。

RPG Character Mecanim Animation Pack


今回もプレイヤーキャラクターのアニメーションに利用させていただきました。

本当になんでも入ってますこれ…。

Amplify Occlusion


シェーダーのAssetです。

まだ使い方がいまいちわかっていませんが、適用したら影のつき方が良くなりました。

10 Sweet Buttons [Pack 2] + BONUS 3 EPIC BUTTONS


前回同様タイトルシーンのボタンに使用しました。

今回はシックな黒色ボタンにしました。

13種類のボタンの素材があります!

Text Mesh Pro


前回同様、タイトルの文字に使用しました。

メタルな感じの文字が好きです。

KTK Effect Sample Set


弾丸が物に当たった時のエフェクトに使用しました。

安定のKTKさんエフェクトです。

KTK Hit Effects Volume1


プレイヤー死亡時の爆発エフェクトに使用しました。

光、火、水、風等の各属性の被弾エフェクトの詰め合わせです。

こちらもおすすめ。

DOTween (HOTween v2)


前作品と同様にリスポーンする際の動作に使用しました。

簡単にスクリプトからオブジェクトを動かすことができます。

Pro版も持っていますが、今回は使っていません。

Pro版はUIオブジェクトなどにコンポーネントを追加することで、簡単に色々なアニメーションさせることができます。

とっても便利!!

Particle Ribbon


復活時と無敵時のエフェクトに使用しました。

キラキラ好き。

Mega Game Music Collection MP3


先日安かったので購入。

タイトルシーンと、戦闘シーンのBGMとして採用しました。

カッコいい音楽がいっぱいあります。

Andoxia Modern Gun – Pistol 1K


プレイヤーキャラクターに武器として2丁持たせました。

2丁拳銃はロマン。

Bullet Holes

タイトル文字に弾痕を入れたかったので使用しました。

ゲーム内の弾丸の跡にも利用できそうです!!

これがあるだけでずいぶんカッコいい。

FPS Hangar

戦闘ステージに利用しました。

先日購入したFPS Warehouseにしようとしていたのですが、描画負荷の関係上こちらを採用しました。

Weapons of Choice – LITE

タイトル画面のボタンの音と攻撃の発射音に使用させていただきました。

発射音だけでなく、リロード音、弾丸の空気を割く音など、沢山の銃周りの音が入っているAssetです。

今回は武器が拳銃なので、拳銃の効果音を中心に利用しましたが、アサルトライフル、ショットガン、サブマシンガン、手榴弾等の爆撃音などの音もあります。

こだわりがなければこれだけで十分なFPSゲームが作れそうです。

Blood-Damage Effect

ダメージを受けた時のエフェクトに利用しました。

FPSだとエフェクトが無いと「ダメージを受けた!」というのが分かりにくいのでこういうEffectがあると良いです。

Muzzleflash Pack

攻撃時に銃から出る火花のAssetです。

プレイヤー攻撃時に出る火花に利用しました。

ピストル、サブマシンガン、ライフル、ショットガン等に使えるようです!

Local Package Importer

ローカルに保存しているAssetの一覧をInspector上に表示できるAsset。

検索が要らないのでスピーディー!!そして無料!

作者のヒロムさんありがとうございます!

Asset Hunter


要らないデータを削除してビルド時間を短縮したりしてくれるAsset。

最後の掃除は任せた!!

unityroomで遊ぼう!!

UTC FPS ONLINEは上の画像をクリックすると遊べます。

是非遊んでみてください(^^)/

皆さま来年もよろしくお願いいたします。

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/utcfpsonline/feed 0
【Unity】Terrainをゴリ押しでObj形式にし、batchesを削減した話 /unity/terraintoobj?utm_source=rss&utm_medium=rss&%23038;utm_campaign=terraintoobj /unity/terraintoobj#respond Thu, 14 Dec 2017 08:39:24 +0000 /?p=679 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

先週unityroomにアップロードしたSUPER SMASH UTCs.ですが、アップロードを急いだせいで当初1つの問題がありました。

その問題とはとにかく重かったのです。

UnityのEditor上ではぬるぬる動いていても、いざWebGLにアップロードするとすこぶる重く、当たり判定や同期に遅延が出たりする始末

とりあえずそんな状態だった当初の戦闘シーンのStatisticsウインドウを見ていただきましょう。

私もこのウインドウの意味をよく分かっているわけではないですが、モバイル端末が安定して動作させるためにはBatchesを100以内に収めるのを目標にすると良いと聞いたことがある。

そのBatchesが500以上重すぎる。

原因究明

まずは何がこの描画負荷を生み出しているかを探るため、戦闘シーンのオブジェクトを1つずつ表示非表示を切り替えて負荷がどのくらい変わるかをチェックしていった。

するとフィールドとして利用していたTerrainを非表示にしたときにBatchesが約35まで下がるではないか。コイツだ

おそらくフィールドとして利用したいがためにTerrainの地形をいじり倒した際に頂点数が急増し、凄まじい負荷を生み出すようになってしまったと思われる。

解決方法

原因が分かったので解決をしようとして色々調べたところ、以下のリンクのTerrainObjExporterなるものが使えるらしい。

これを使えばTerrainを頂点数を減らした上でObj形式で出力できるらしいのでやってみた。

以下が出力されたオブジェクトです。

Obj形式で出力は簡単にできたものの、頑張って塗り塗りしたテクスチャが無くなってしまいました。

現状Terrainのテクスチャを無料で書き出す方法は探しても見つからなかったため、元のTerrainを真上からスクショを撮ってその画像を用いてMaterialファイルを作成するというゴリゴリのゴリな方法を実行してみました。

以下がMaterialファイルに使った真上からスクショした画像です。

そしてそのMaterialファイルを適用したオブジェクトがこちら。

で、当初との比較がこちら。左が当初のTerrain、右がObj形式で出力したフィールドObj。

少し色が暗くなってしまいましたが、案外ゴリ押しでもそれなりな見た目になりました。

これで軽くなってくれるならまあ良しとしましょう。

気になるBatchesの結果は…

Obj形式にしたあとの戦闘シーンのStatisticsウインドウがこちらです。

負荷が一気に削減されました!!

なんとSetPassCallは約270⇒約30となり、以前の約11%まで抑えられました。

Batchesに至っては約500⇒約35となり、約7%

これでWebGLでもヌルヌル動いてくれるようになりました!( ´∀`)

有料の方法(やってないので出来るかは分からない)

下記Assetの説明を見る限り、おそらくTerrainからテクスチャなどの情報を持ったObjファイルに出力できるのではないかと思われるが、$25がなかなか手が出せず、試せていません。

試して頂ける方いたらやってみて欲しいです。セールになったら買いたい。

まとめ

ゴリ押しでしたが、一応Terrainを軽いObj形式で出力し、描画負荷を大幅削減することができました。

モバイルのアプリを作成している方々はどうやってTerrainを軽くしているのか分かりませんが、もっと賢い良い方法がありそうです。

もし教えて戴ける優しい偉い人がおられたらTwitterでもメールでも良いので教えて頂けると大変嬉しいです。

ここまで読んでいただきありがとうございました。

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/terraintoobj/feed 0
SUPER SMASH UTCs. を投稿しました!! /unity/super-smash-utcs?utm_source=rss&utm_medium=rss&%23038;utm_campaign=super-smash-utcs /unity/super-smash-utcs#respond Wed, 06 Dec 2017 19:28:20 +0000 /?p=665 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

この前のunity1weekのバウチャーを頂ける企画が今月末まで続いているという情報を聞き、もう一つゲームを作りました!!

その名も SUPER SMASH UTCs. !!

ス●ブラのようなゲームをイメージして作成しました。

今回のゲームで特に苦戦したのはプレイヤーキャラの挙動とその同期でした。

今までプレイヤーの操作はCharacterControllerでしか作ったことが無かったので、初見のRigidBody+Colliderには大変苦戦しました…
なんとか及第点をあげられる程度の操作はできるようになりましたので良かったら遊んでみてください(^^)/

以下、利用させていただいたAssetと、ゲームのどこに利用させていただいたかの説明になります。

利用させていただいたAssetたち

Game Jam Menu Template

毎度おなじみ。簡単にタイトルのシーンを作成できるAssetです。

Prefabのドロップ&ドロップで簡易タイトルシーンを設定できます。

超便利。大変お世話になっております。

Angrave Delight


タイトルの背景に使用しました。

金属的な模様が欲しかったので、採用しました。

Photon Unity Networking Free

またまたおなじみ。オンラインゲームを作成するためのAssetです。

このブログでは使い方を紹介しています。こちらもいつも大変お世話になっております。

AllSky


対戦シーンの背景に使用しています。

このAssetがあれば、まずSkyboxに困ることは無いんじゃないでしょうか?

おすすめ。

Optimize, SD Kohaku-Chanz!


SDこはくちゃんとその仲間達です。

プレイヤーキャラとして採用しました。

かわいい。好き。

First Fantasy for Mobile


フィールドの作成に使用しました。

モバイル向けの低ポリで可愛い素材です。

今回は使いませんでしたが、パーティクルやSkyboxなども一緒に入っていて嬉しい。

購入を考えている方はWebGLのデモがあるので見ていただくと良さが分かると思います。

RPG Battle Music


対戦シーンのBGMとして採用しました。

結構沢山のAssetを探したのですが、なかなか合うものがなくて、最終的にこのAssetに行き着きました。

Amplify Occlusion


シェーダーのAssetです。

まだ使い方が全く分かっていませんが、この前のバウチャーで購入したのでとりあえずカメラに適用させてみました。

光の当たり方具合が少し変わった感じがします。

Unityのデフォルトのシェーダーより軽いとかなんとか書いてましたが、大して重いゲームでもないので体感できません。

シェーダーについては勉強が必要ですね。

RPG Character Mecanim Animation Pack


この前のバウチャーで購入しました。

プレイヤーキャラクターのアニメーションに利用させていただきました。

それなりに値段は張りましたが、圧倒的アニメーションの数で当分このAssetだけでアニメーション素材は大丈夫そうです。

10 Sweet Buttons [Pack 2] + BONUS 3 EPIC BUTTONS


タイトルのボタンに使用しました。

今はセール中だったのでわずか$0.90で購入!

13種類のボタンの素材があります!

Text Mesh Pro


タイトルの文字に使用しました。

Unity標準装備になったはずだったような気がしたのですが、何故かなかったので、インポート。

超簡単にオシャレな文字を生成可能です!!

KTK Effect Sample Set


タイトル画面の演出やプレイヤーの攻撃や被弾などに使用しました。

KTK_kumamoto様のエフェクトにはいつも大変お世話になっております。

素晴らしいクオリティのエフェクトをいつもありがとうございます!!

UI Sound Effects Collection Pack 2: Buttons


ボタンを押した時の音が30個入ったAssetです。

Startのボタンの音に使用しました。

UIから音が鳴るだけでちょっとゲームらしくなりますね!!

FREE Casual Game SFX Pack


50個の色々な音源が入ったAssetです。

Optionsボタンの音に使用しました。

DOTween (HOTween v2)


リスポーンする際の動作に使用しました。

噂には聞いていましたが、凄い便利。

Proが欲しくなりました。

DEMO Battle Music Pack


タイトル画面のBGMとして使用しました。

5つのBGMが入っているAssetです。

今回使った音楽は「拳闘!」という感じで良い。

 

<12/9追記 忘れてしまっていました!!>

Particle Ribbon


復活時と無敵時のエフェクトに使用しました。

綺麗かつ格好いいエフェクト。ビーム発射前のチャージとかにも使えそう。

unityroomで遊ぼう!!

SUPER SMASH UTCs.は上の画像をクリックすると遊べます。

是非遊んでみてください(^^)/

unityroom企画に感謝

unity1weekで貰ったバウチャーで新たなAssetを買って、そのAssetを使って新しいゲームを作って、バウチャー貰って、Asset買って、ゲーム作って…

なんだこれ。無限にバウチャー湧いてくるのでは?

Unityさんが心配になるレベルの太っ腹で本当に有難い!!

年末までまだ時間があるので、是非皆さんも参加することをお勧めします!

unityroomを管理してくださっているnaichi様にも感謝!

Unity最高です。

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/super-smash-utcs/feed 0
unityroom1WeekGameJamに参加しました! /unity1week/spaceonline?utm_source=rss&utm_medium=rss&%23038;utm_campaign=spaceonline /unity1week/spaceonline#respond Sat, 18 Nov 2017 17:18:34 +0000 /?p=638 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

2017年11月14日、仕事の休憩中にきっとポジション様のこのようなツイートを発見。

なにぃ…!これはすごい!こんなんやるしかないだろぉ!!

と思い立ち、アセットバウチャー欲しさに1週間ゲームジャムに参加しました!

お題は「Space」ということで、何を作ろうか悩んだところ、折角オンラインゲーム開発をしているので、このブログで作ったオンラインゲームを簡単に改造してゲームにしようと考えました。

Spaceといえば宇宙!宇宙といえば宇宙船バトル!これだ!

ということでSpaceOnlineを作りました!!

ページ下部のリンクからプレイしていただくことが可能です!

何やら利用したAssetを紹介することで、更なるバウチャーが戴けるようなので、求められていなくてもご紹介します。

利用させていただいたAssetたち

Space Fighter


プレイヤーのオブジェクトとして利用させていただきました。

スターウォーズの中で出てきそうな乗り物の3Dモデルです。

利用する際になぜかオブジェクトのMaterialが設定されておらず、設定しなければいけなかったこと以外はとっても使いやすいです。

動くときとブレーキをしたときにブースターの炎を制御するような謎のこだわりを取り入れたかったのですが、このモデルではブースターをParticleで制御していないので、ブースターの炎だけ後で紹介するSpace ArcadeというParticleのAssetを利用させていただきました。

Space Arcade


ParticleのAssetです。

プレイヤーオブジェクトのブースターの青い炎、プレイヤーの攻撃、プレイヤーのダメージエフェクトで利用させていただきました。

アニメみたいな感じですが、これはこれでGoooood!!!

Vast Outer Space


色々な惑星のオブジェクトがあるAssetです。

折角の宇宙ステージなので星たちを導入してみました。

Game Jam Menu Template

とても簡単にタイトルのシーンを作成できるAssetです。

Prefabのドロップ&ドロップでシーンに設定できます。

Unity Samples: UI


Game Jam Menu Templateと共にタイトルシーンで利用しました。

これを使ってインベーダーゲームのようなタイトルシーンにしました。SFの雰囲気が出る感じでオシャレ。

Photon Unity Networking Free

オンラインゲームを作成するためのAssetです。

このブログでは使い方を紹介しています。いつもお世話になっています。素晴らしい。

AllSky


タイトルシーンの背景に使用しています。

白い文字の背景に使うので暗めのSkyboxを使いました。

有料ですが、大量の良質なSkyboxが入ってるAssetなので、空が好きな方は是非どうぞ。

Purple Space Nebula Skybox


宇宙空間のようなSkyboxです。

戦闘のシーンにて導入しています。

Weapons of Choice – FREE

プレイヤーの攻撃時の音に使用しています。カッコいい弾丸の音です。

SciFi Music Pack

タイトルと戦闘シーンに良いBGMのAssetがあったので利用してみました。

雰囲気には合ってるかなと思います。

Unityroomでプレイ

上の画像をクリックでプレイ。

11/20 20:00に自動的に公開されます。

操作性が悪かったり、UIが手抜き状態な部分が目立ちますが、お許しください。

そこまで手を回せるリソースがありませんでした…

また時間取れればしっかり作り込みたいです。

 

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity1week/spaceonline/feed 0
【Unity】Cameraの使い方ー基礎編 /unity/camera?utm_source=rss&utm_medium=rss&%23038;utm_campaign=camera /unity/camera#respond Thu, 09 Nov 2017 22:38:25 +0000 /?p=610 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

Cameraとは

Cameraはゲーム内でのユーザの目の役割をする大変重要なオブジェクトです。

なのでScene内にCameraオブジェクトが無ければ、ゲーム画面には何も表示されません。

Sceneでは用途に応じて複数のカメラを作成し、複数のカメラをゲーム画面に表示することができます。

例えばキャラクター視点のメインカメラと併せて、キャラクターがマップ上のどこに位置するかを可視化するためのミニマップを作成したりできます。

Clear Flags – 画面のクリア方法

背景(何のオブジェクトも描画していない範囲)の描画をどのように更新するかを設定できます。

デフォルトではSkyboxが設定されています。

Skybox

Skyboxを描画します。SkyboxはAssetStoreにて色々な素材がありますので見てみてください。

私は以下のAllSkyというAssetを購入しました。160個のSkyboxが安価に手に入るのでオススメです!

Solid Color

指定した単色を背景に設定します。

Depth Only

複数のカメラがある場合、メインカメラ以外のカメラに設定します。

背景はメインのカメラの設定となり、メインカメラの前面にその他のカメラは描画します。

※注 このときサブカメラのDepthの値はメインカメラのDepthの値よりも大きい値を設定しておく必要があります。

Don’t Clear

Don’t Clearは背景の描画の更新を行いません。

1つ前のフレームの上に次のフレームを上書きする形で更新を行います。

Culling Mask – 描画オブジェクト選択

画面に描画するオブジェクトのレイヤーを選択します。

これによってカメラに映るオブジェクトと映らないオブジェクトを設定したりできます。

Projection – 投影方法

Perspective

Perspectiveは、遠近感がある描画を行います。

一般的な3Dゲームで用いる描画方法です。

Orthographic

Orthographicは遠近感のない平行投影の描画を行います。

UIの表示や2Dゲームなどで用いると便利かも。

視界調整

Field of View

視野角のパラメータです。この値が大きければ大きいほど広い視野が得られます。

一般的にはズームしたいときに使うと良いようです。

Clipping Planes

カメラからどの距離の範囲を描画するかを調節するパラメータです。

Near が描画最短距離、Far が描画最長距離となっています。

つまりNearとFarの間のオブジェクトしか表示されません。

Near

Far

画面上の表示位置調整

View Port Rect

  • X ・・・画面上の横方向の描画位置を制御します。-1.0 ~ 1.0の範囲の値を取り、0であれば画面いっぱいに、負の値であれば画面の左側の範囲、正の値であれば画面の右側の範囲に映像を描画する。
  • Y ・・・画面上の縦方向の描画位置を制御します。-1.0 ~ 1.0の範囲の値を取り、0であれば画面いっぱいに、負の値であれば画面の下側の範囲、正の値であれば画面の上側の範囲に映像を描画する。
  • W・・・画面上の描画範囲の横幅を制御します。0.0~1.0の範囲の値を取る。
  • H ・・・画面上の描画範囲の縦幅を制御します。0.0~1.0の範囲の値を取る。

Depth – カメラの深度

カメラが複数ある場合、カメラの描画の順序を制御できるパラメータです。

Depthが大きい値のカメラほど手前に描画されます。

HDR(High Dynamic Range)

現実世界の色表現を考慮した描画を行うという感じですかね…?

特に問題が無ければONにしておいて良い気がする。

詳しくは以下のマニュアルを参照してください。

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/camera/feed 0
【Unity】Canvasの使い方ー基礎編 /unity/canvas?utm_source=rss&utm_medium=rss&%23038;utm_campaign=canvas /unity/canvas#respond Fri, 03 Nov 2017 19:13:50 +0000 /?p=599 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

今日から自分のために週2くらいのペースで学んだことメモをしていこうと思います。

継続は力なり。

Canvasとは

Canvasとは簡単に言うとUIオブジェクトの親となるオブジェクトです。

Unityの決まり上、ボタン、テキストフィールドなどのUIオブジェクトはCanvasコンポーネントをもつオブジェクトが親オブジェクトでなければ機能しません。

なので、シーン上にCanvasオブジェクトが存在しないときに、UIオブジェクトを作成するとCanvasオブジェクトが親オブジェクトとして自動生成されます。

Canvasを作成すると自動的にEventSystemオブジェクトも作成されます。EventSystemはシーンのイベントを処理するためのものです。
EventSystemについても別の機会に詳しく勉強して記事にしたいと思います。

Canvasオブジェクトの構成

Canvasオブジェクトは以下の3つのコンポーネントがアタッチされています。

  • Canvas
  • Canvas Scaler
  • Graphic Raycaster

以下でそれぞれについて説明します。

Canvasコンポーネント

CanvasコンポーネントはUIの描画方法や、描画するカメラの指定などを設定できます。

Render Mode

描画方法の種類です。

  1. Screen Space – Overlay
  2. Screen Space – Camera
  3. World Space

それぞれの違いについてはTECH Projin様の以下の記事で分かりやすい動画を交えて紹介してくださっています。わかりやすぅい!

Canvas Scaler コンポーネント

Canvas ScalerコンポーネントではUIのスケールとピクセル密度を制御できます。

簡単にいうと様々な画面サイズに対応してUIオブジェクトのサイズを自動調整するためのコンポーネントです。

UIの調整方法については以下の3種類があります。

  1. Constant Pixel Size
  2. Scale With Screen Size
  3. Constant Physical Size

これらの方法についてはひよこのたまご様が詳しく記事にしてくださっています。

Graphic Raycaster コンポーネント

Graphic Raycaster コンポーネントはCanvas上にあるUI要素のグラフィックを監視し、クリックやタッチを検出する機能があります。

つまりこのコンポーネントが無ければタッチやクリックが出来ません。

プロパティには

  • Ignore Reversed Graphics…レイキャスターから反対方向のグラフィックス面の考慮をONOFF
  • Blocked Objects…グラフィックスのレイキャストをブロックするオブジェクトのタイプを指定可能
  • Blocking Mask…グラフィックスのレイキャストをブロックするレイヤーのタイプを指定可能

があります。

重なっているオブジェクトに対して実行の優先順位を設定することができるようです。

あまり触られることがないコンポーネントなのか資料が少ないので使い方が正直良く分かりません。新たに楽しい使い方を学んだ時は追記するかもしれません。

最後に

Unityのチュートリアル動画もとってもわかりやすいので是非視聴されることをお勧めします。日本語字幕もあるので是非。

個人的にはUIを傾けて表示させて奥行を持たせるというのにオシャレなUIの可能性を感じました。いつかどこかで使いたいです。

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/canvas/feed 0
Unityオンラインゲーム作成【Chapter12】Lobbyシーンの作成 /unity/mmogame/lobbyscene?utm_source=rss&utm_medium=rss&%23038;utm_campaign=lobbyscene /unity/mmogame/lobbyscene#respond Wed, 04 Oct 2017 16:34:14 +0000 /?p=512 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

今回の記事ではLobbyシーンを作成します。

記事が長くなってしまったので2ページ構成となっております。

ロビーとルームについては以下の記事を参照してください。

Unityオンラインゲーム作成 ロビーとルームについて

今回はPhotonのロビーとルームについて説明します。 なんとなく言葉から想像はつくかもしれませんが、例えばホテルで宿泊するときの手順を思い浮かべてください。 ホテルの入り口から入る ロビーの受付に行 …

続きを見る

Lobbyシーン

まずはどのようなものを作成するかイメージを掴むために以下の動画をご覧ください。

今まではログイン画面からすぐにゲームルームに遷移していましたが、今回はログイン画面とゲーム画面の間に動画のようなLobbyシーンを作成します。

Lobbyシーンはプレイヤーが自分でルームを作成したり、ルームの一覧からルームを選んでゲームに参加したりできるようにするシーンです。

まずLobbyシーンのHierarchyビューを見てみましょう。

ロビーシーンを構成する主な要素は以下の5つです。

  1. 部屋作成用パネル(CreateRoomPanel)
  2. 部屋一覧表示用パネル(RoomInfoPanel)
  3. 部屋一覧の要素パネルプレハブ(RoomElement)
  4. 部屋作成用パネルを管理するLobbyUI
  5. 部屋一覧の情報を取得するLobbyManager

これらそれぞれを1つずつ作成していきましょう。

部屋作成用パネル

プレイヤーが部屋を作成する際に必要な情報を入力するウィンドウを作成します。

今回の部屋作成に必要な情報は部屋名と入室可能人数の2つとします。

以下の画像が部屋作成用パネルのHierarchyビュー上での構成とゲーム上での見え方となります。

とりあえずここで気を付けるべきことはCreateRoomPanelの下に全ての要素があることです。

部屋作成ウィンドウの表示非表示操作を、親オブジェクトであるCreateRoomPanelのActive、InActiveによって実現するためです。

部屋の作成などの処理に関しては、後々作成するLobbyUIというオブジェクトのスクリプト内で行うのでここでは不要です。

つまりUIの外観さえ整えばOKです。

OpenRoomPanelButton(部屋作成用パネル表示用ボタン)

OpenRoomPanelButtonは部屋作成用パネルの表示、非表示を切り替えるためのボタンです。

※ボタンを押した時の処理は、後々作成するLobbyUIのLobbyUIScriptの中で定義しています。

スポンサーリンク

rectangle_l

部屋一覧表示用パネルとスクロールビュー

以下のような、ロビーにいる間存在する部屋の一覧を表示するパネルを作成します。

今回はとりあえず縦方向にしかスクロールできないビューにしているのでScroll Viewを作成した時に作られるScrollbar Horizontalは削除しています。

それ以外のオブジェクトの設定は以下の通りです。

Create/UI/Scroll Viewより新規作成した後、設定を変更した項目は赤枠で囲んでいます。

RoomScrollViewのInspector

今回、水平方向のスクロールは行わないのでHorizontal関連の設定は解除しています。

ContentのInspector(RoomScrollViewの孫オブジェクト)

Vertical Layout Group縦方向に上手く要素を並べるために適用しています。

Content Size Fitter要素の大きさをうまく調節するために適用しています。

Scrollbar VerticalのInspector(RoomScrollViewの子オブジェクト)

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/mmogame/lobbyscene/feed 0
Unityオンラインゲーム作成 ロビーとルームについて /unity/lobby_and_room?utm_source=rss&utm_medium=rss&%23038;utm_campaign=lobby_and_room /unity/lobby_and_room#respond Tue, 03 Oct 2017 00:44:24 +0000 /?p=515 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

今回はPhotonのロビーとルームについて説明します。

なんとなく言葉から想像はつくかもしれませんが、例えばホテルで宿泊するときの手順を思い浮かべてください。

  1. ホテルの入り口から入る
  2. ロビーの受付に行って部屋を選ぶ
  3. 部屋に入る

という手順になると思いますが、同様にPhotonで作成するオンラインゲームでも

  1. Photonに接続する
  2. ロビーに入ってルーム一覧からルームを選ぶ
  3. ゲームルームに入る

というゲームシステムの構成にすることができます。

ロビー

PhotonのSettingsのAuto-Join LobbytrueにしているとPhotonに接続後、自動的にロビーに移動します。

プレイヤーはロビーでルームの一覧を参照し、ルームを作成したり、既存のルームに入室したりすることができます。

ルーム数が膨大となってしまい、ルームの検索が大変になる場合はロビーを複数作ることも可能です。

ルームとは

ルームはプレイヤー同士が共にゲームをプレイする場です。

ルーム内でのみ他のプレイヤーと通信し、空間を共有することができます。

ルーム設定

ルームにはRoomOptionsという作成時または作成後に設定できるルームの性質があります。

以下の5つが主なRoomOptionsで設定可能なルームの性質となります。

bool RoomOptions.IsVisible

ルームがロビーでのGetRoomList()で検索対象となるかを設定することができます。

trueで検索対象となり、falseで検索対象から外れます。

bool RoomOptions.IsOpen

ルームへの入室の可否を設定することができます。

trueで入室可、falseで入室不可となります。

byte RoomOptions.MaxPlayers

ルームの最大入室可能プレイヤー数を設定できます。

int型ではなくbyte型だということに注意してください。

HashTable RoomOptions.CustomRoomProperties

HashTable型のルームのカスタムプロパティです。

ルームのカスタムプロパティとは簡単に言うとルームが所持できるHashTableです。

HashTabelはあるObject型のキーに対してObject型のデータを格納できる特殊な配列ですが、カスタムプロパティでは、あるプレイヤーが設定した情報が同じルームに接続しているプレイヤー全てに同期されます。

string[] RoomOptions.CustomRoomPropertiesForLobby

CustomRoomPropertiesForLobbyにルームのカスタムプロパティのキー値を設定すると、そのカスタムプロパティの値をロビーからも参照できるようになります。

ルーム内の情報をロビーで得るための数少ない手段です。

MasterClient

Photonのルームには必ずMasterClientと呼ばれるプレイヤーが存在します。

ルーム作成時にはルーム作成者がMasterClientとなり、MasterClientがルームから退出するときは同じルームにいる最もPhotonViewIDの番号が小さいプレイヤーが次のMasterClientとなります。

PUNではゲームを管理するために、同ルーム内のプレイヤーからRPCでMasterClientへ情報を同期させ、処理を任せたりすることもできます。

より詳しい情報

TutorialOnlineにて利用しそうなことに関してはざっくりと説明しましたが、より詳しく知りたい方は以下のリンクのQiitaのk0mach1様の記事に書いてありますので、参照してみてください。

また、さらにPUNのルームやロビー間の処理に関してはうら干物書き様が詳しく調べてくださっています。とても参考になるので一度目を通すことをお勧めいたします。

最後に

本記事で説明したことを応用すれば鍵付きのルームを作成したりすることも可能なので是非やってみてください!

もし余裕があれば記事にしたいと思います。

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/lobby_and_room/feed 0
Unityオンラインゲーム作成【Chapter11】カーソルの実装 /unity/mmogame/chapter11_mousecursor?utm_source=rss&utm_medium=rss&%23038;utm_campaign=chapter11_mousecursor /unity/mmogame/chapter11_mousecursor#respond Fri, 29 Sep 2017 16:36:07 +0000 /?p=490 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

今回の記事ではカーソルを実装します。

カーソルとは

どのようなものかはまず以下の画像を見てください。

ユニティちゃんの横に水色のオブジェクトがマウスの先にあるのが分かりますね。

このようにゲーム内でマウスに追従するポインタの役割をするオブジェクトがカーソルです。

そして今回はそのカーソルを利用して、前回の戦闘の導入ではキャラクターの正面にしか飛ばせなかった攻撃を、カーソルに向かって攻撃を飛ばせるようにしましょう!

カーソルの導入手順

カーソルの導入手順は以下の通りです。

  1. MouseCursorオブジェクトの作成
  2. レイヤー”Player”と”Attack”を追加し、プレイヤープレハブと攻撃の球プレハブを設定
  3. CursorManageScriptを作成し、MouseCursorオブジェクトにセット
  4. CharacterControlScriptを変更

MouseCursorオブジェクトのInspectorビュー

カーソルは見た目上分かりやすいように水色のCursorMatというmatファイルを作成し、Materialsに適用しています。

“Player”、”Attack”レイヤーの追加と設定

以下の画像のように新規のUser Layerを追加します。

ユニティちゃんのPrefabのLayerを”Player”に、攻撃の球オブジェクトのLayerを”Attack”に設定します。

CursorManageScript.csのソースコード

using UnityEngine;
using System.Collections;

public class CursorManageScript : MonoBehaviour
{
    void Update()
    {
        //カメラからマウスがある場所に向かってRayを発射
        RaycastHit hit;
        //layer8と9の"Player"と"Attack"には当たらないためのマスク
        int layerMask = ~(1 << 8 | 1 << 9); 
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
        {
            //Rayが当たった所にカーソルを移動させる
            transform.position = hit.point; 
        }
    }
}

カメラからマウスカーソルがある方向にRayを飛ばし、Rayが当たった場所にカーソルを動かすようにしています。

普通のゲームではキャラクターや攻撃にカーソルは乗らないので、layerMaskでUser Layer 8の”Player”レイヤーとUser Layer 9の”Attack”レイヤーのオブジェクトにはRayが当たらないようにしています。

なのでプレイヤーと攻撃のオブジェクトのレイヤーが違う番号であればlayerMaskの数字を書き換えてください。

CharacterControlScript.csの変更後ソースコード

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

public class CharacterControlScript : MonoBehaviour {

    //オンライン化に必要なコンポーネントを設定
    public PhotonView myPV;
    public PhotonTransformView myPTV;

    private Camera mainCam;

    //移動処理に必要なコンポーネントを設定
    public Animator animator;                 //モーションをコントロールするためAnimatorを取得
    public CharacterController controller;    //キャラクター移動を管理するためCharacterControllerを取得

    //移動速度等のパラメータ用変数(inspecterビューで設定)
    public float speed;         //キャラクターの移動速度
    public float jumpSpeed;     //キャラクターのジャンプ力
    public float rotateSpeed;   //キャラクターの方向転換速度
    public float gravity;       //キャラにかかる重力の大きさ

    Vector3 targetDirection;        //移動する方向のベクトル
    Vector3 moveDirection = Vector3.zero;

    //戦闘用変数&状態フラグ管理
    public GameObject BallPrefab;   //ボールPrefab
    bool MoveLock = false;                  //移動ロックフラグ
    bool AttackLock = false;                //連射防止用攻撃ロックフラグ
    bool invincible = false;                //無敵フラグ
    bool Deadflag = false;                   //死亡フラグ

    //マウスカーソルの位置取得用
    Transform Cursor;

    // Start関数は変数を初期化するための関数
    void Start () {
        if (myPV.isMine)    //自キャラであれば実行
        {
            //MainCameraのtargetにこのゲームオブジェクトを設定
            mainCam = Camera.main;  
            mainCam.GetComponent<CameraScript>().target = this.gameObject.transform;

            //マウスカーソルのTransformを設定
            Cursor = GameObject.Find("MouseCursor").transform;
        }
    }

    // Update関数は1フレームに1回実行される
    void Update () {
        //自キャラでなければ操作しないためreturn
        if (!myPV.isMine)
        {
            return;
        }

        //移動ロックONまたは死亡フラグONであれば移動、攻撃をさせない
        if (!MoveLock && !Deadflag)
        {
            moveControl();  //移動用関数
            RotationControl(); //旋回用関数
        }

        //攻撃ロックがかかっていなければ攻撃できる
        if (!AttackLock)
        {
            //攻撃処理
            AttackControl();
        }
        
        //最終的な移動処理
        //(これが無いとCharacterControllerに情報が送られないため、動けない)
        controller.Move(moveDirection * Time.deltaTime);


        //スムーズな同期のためにPhotonTransformViewに速度値を渡す
        Vector3 velocity = controller.velocity;
        myPTV.SetSynchronizedValues(velocity, 0);   
    }

    void moveControl()
    {
     //★進行方向計算
        //キーボード入力を取得
        float v = Input.GetAxisRaw("Vertical");         //↑↓の入力       
        float h = Input.GetAxisRaw("Horizontal");       //←→の入力 

        //カメラの正面方向ベクトルからY成分を除き、正規化してキャラが走る方向を取得
        Vector3 forward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;   
        Vector3 right = Camera.main.transform.right; //カメラの右方向を取得

        //カメラの方向を考慮したキャラの進行方向を計算
        targetDirection = h * right + v * forward;

     //★地上にいる場合の処理
        if (controller.isGrounded)      
        {
            //移動のベクトルを計算
            moveDirection = targetDirection*speed;

            //Jumpボタンでジャンプ処理
            if (Input.GetButton("Jump"))    
            {
                moveDirection.y = jumpSpeed;
            }
        }
        else        //空中操作の処理(重力加速度等)
        {
            float tempy = moveDirection.y;
            //(↓の2文の処理があると空中でも入力方向に動けるようになる)
            //moveDirection = Vector3.Scale(targetDirection, new Vector3(1, 0, 1)).normalized;
            //moveDirection *= speed;
            moveDirection.y = tempy - gravity * Time.deltaTime;
        }

     //★走行アニメーション管理
        if (v > .1 || v < -.1 || h > .1 || h < -.1) //(移動入力があると)
        {
            animator.SetFloat("Speed", 1f); //キャラ走行のアニメーションON
        }
        else    //(移動入力が無いと)
        {
            animator.SetFloat("Speed", 0f); //キャラ走行のアニメーションOFF
        }
    }

    void RotationControl()  //キャラクターが移動方向を変えるときの処理
    {
        Vector3 rotateDirection = moveDirection;
        rotateDirection.y = 0;

        //それなりに移動方向が変化する場合のみ移動方向を変える
        if (rotateDirection.sqrMagnitude > 0.01)
        {
            //緩やかに移動方向を変える
            float step = rotateSpeed * Time.deltaTime;
            Vector3 newDir = Vector3.Slerp(transform.forward, rotateDirection, step);
            transform.rotation = Quaternion.LookRotation(newDir);
        }
    }

    //ボール攻撃
    void AttackControl()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            //カーソル方向に向く
            transform.LookAt(Cursor);

            //攻撃ロック開始
            AttackLock = true;
            StartCoroutine(_ballattack(1f));
        }
    }

    IEnumerator _ballattack(float pausetime)
    {
        //RPCでボール生成
        myPV.RPC("BallInst", PhotonTargets.AllViaServer, transform.position + transform.up, transform.rotation);
        //攻撃硬直のためpausetimeだけ待つ
        yield return new WaitForSeconds(pausetime);
        //攻撃ロック解除
        AttackLock = false;
    }

    [PunRPC]//ボール生成
    void BallInst(Vector3 instpos, Quaternion instrot, PhotonMessageInfo info)
    {
        //ボールを生成
        GameObject Ball = Instantiate(BallPrefab, instpos, instrot) as GameObject;
        Ball.GetComponent<BallManageScript>().Attacker = info.sender; //ボールに自分のPhotonPlayer情報を乗せる
    }

    #region 被弾関連処理
    void OnTriggerEnter(Collider col)
    {
        //自キャラ以外なら処理しない
        if (!myPV.isMine)
        {
            return;
        }

        if (Deadflag || invincible) //死亡時または無敵時は処理しない
        {
            return;
        }
        
        PhotonPlayer colAttacker = col.GetComponent<BallManageScript>().Attacker;

        //当たった物がボールではないまたは自分が生成したボールならなにもしない
        if (!col.CompareTag("Ball")||colAttacker.IsLocal) 
        {
            return;
        }
        else
        {
            //ダメージを与える
            LocalVariables.currentHP -= 20;

            //攻撃側プレイヤーのkillcount++処理
            if (LocalVariables.currentHP > 0)
            {
                myPV.RPC("Damaged", PhotonTargets.AllViaServer);  //被弾処理RPC
                StartCoroutine(_rigor(.5f));    //被弾硬直処理
            }
            else
            {
                myPV.RPC("Dead", PhotonTargets.AllViaServer);    //死亡処理RPC
                StartCoroutine(_revive(3.5f));    //復活処理
            }
        }
    }

    //被弾処理同期用RPC
    [PunRPC]
    void Damaged()
    {
        
        MoveLock = true;    //硬直のため移動ロックON
        animator.SetTrigger("DamagedTrigger");  //ダメージアニメーション
    }

    //ヒット時硬直処理
    IEnumerator _rigor(float pausetime)
    {
        yield return new WaitForSeconds(pausetime); //倒れている時間
        MoveLock = false;   //移動ロック解除
    }

    //死亡処理同期用RPC
    [PunRPC]
    void Dead()
    {
        Deadflag = true;    //死亡フラグON
        AttackLock = true;  //攻撃ロックON
        MoveLock = true;    //移動ロックON
        animator.SetTrigger("DeathTrigger");    //死亡アニメーションON
    }

    //復活コルーチン
    IEnumerator _revive(float pausetime)
    {
        yield return new WaitForSeconds(pausetime); //倒れている時間
        //復活
        Deadflag = false;   //死亡解除
        AttackLock = false; //攻撃ロック解除
        MoveLock = false;   //移動ロック解除
        invincible = true;  //死亡後無敵開始
        LocalVariables.currentHP = 100; //HP回復
        yield return new WaitForSeconds(5f);    //死亡後無敵時間
        invincible = false; //無敵解除
    }
    #endregion
}

CharacterControlScript.cs自体が長くなってきてややこしく思うかもしれませんが、今回追加したスクリプトはマークされている6行のみです。

カーソルのTransformを常に取得しておき、攻撃時にカーソルのPositionの方向をキャラクターが向くようにしています。

実際に動かしてみましょう!

カーソルのオブジェクトがマウスに追従し、攻撃はカーソル方向に発射していることが分かります。

今までは攻撃の方向を操作するのが難しかったですが、簡単になりました!

次回予告!!

次回は色々なUIの設置について書きたいと思います。

お楽しみに!!

 

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/mmogame/chapter11_mousecursor/feed 0
Unityゲーム用オススメ素材元サイトまとめ /unity/materials/matome?utm_source=rss&utm_medium=rss&%23038;utm_campaign=matome /unity/materials/matome#respond Wed, 27 Sep 2017 15:55:02 +0000 /?p=440 Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>

今回はよく使うUnityのゲーム用素材集めに大変お世話になっている、または今後お世話になりそうなサイトを一挙にご紹介いたします。

また良い素材サイト様を見つける度に更新していきます。

良い素材サイトをご存知の方は教えて頂けると嬉しいです。

総合素材サイト

Asset Store 様

皆知ってる皆大好きAsset Storeです。

なんでもあります。お金があれば何でも手に入ります。

そして「こんなに良いものが無料なの!!??」という素材も結構沢山あります。

正直探すのが面倒なほどの素材量ですので、頑張って自分のゲームにあうものを探してください笑

 

アイコン素材

icooon mono 様

商用利用可能なフリーのモノクロアイコン素材が6000個以上あるサイトです。

ボタン等で本当にお世話になっております。

 

FLATICON 様

Freepik様が運営するフリーアイコン素材のサイトです。

2017年9月現在549000個という膨大なアイコン素材があります。

英語なので利用しても良いのかよく分からない怖さがありましたが、以下のサイトにて利用について分かりやすく説明されています。

 

 

パーティクル素材

ゲーム開発奮闘記 様

KTK_kumamoto様による沢山のカッコいいパーティクルのサンプルを配布しておられるブログです。

沢山のサンプルを改造し使わせて頂いています。ありがとうございます。

 

BGM・効果音素材

魔王魂 様

商用OK、改変OK、利用報告不要のフリー音楽素材(歌やBGMや効果音)を1000点以上配布しておられるサイトです。

私は主に効果音で大変お世話になっております。ありがとうございます。

 

無料効果音で遊ぼう! 様

小森様が運営されている約1460個のフリー音素材を配布しているサイトです。

私は主に戦闘系の効果音でお世話になっております。いつもありがとうございます。

 

DOVA-SYNDROME 様

商用、加工可、著作権フリーのBGM・音楽素材を配布されているサイトです。

2017年9月現在では6625曲のフリーBGM822音のフリーSE(効果音素材)があります。

特に良いBGMが沢山あるのでゲームに取り入れてはいかがでしょうか?

 

 

Copyright © 2022 Uniblo-ゆにブロ- All Rights Reserved.

]]>
/unity/materials/matome/feed 0