【ハルシオンブログ】コンポーネントのコンテキストメニューからメソッド呼び出したいとき
こんにちは。
大坂です。
たまにコンポーネントの特定のメソッドを動かしたいときとかがあります。
そんな時は「ContextMenu」を使えばコンポーネントのコンテキストメニューから呼び出せますね。
コンテキストメニューは以下画像の四角あたりを右クリックするか右上の丸のところの歯車をクリックするかで表示されるやつです。

でメソッド呼び出すのはこんな感じで書くだけです。

出てきますね。
これをクリックするとContextMenuを設定したメソッドが簡単に呼び出せます。
では今週もこれにてノシ
大坂です。
たまにコンポーネントの特定のメソッドを動かしたいときとかがあります。
そんな時は「ContextMenu」を使えばコンポーネントのコンテキストメニューから呼び出せますね。
コンテキストメニューは以下画像の四角あたりを右クリックするか右上の丸のところの歯車をクリックするかで表示されるやつです。

でメソッド呼び出すのはこんな感じで書くだけです。
[ContextMenu("ContextTest")]
public void ContextTest()
{
Debug.Log("Test");
}

出てきますね。
これをクリックするとContextMenuを設定したメソッドが簡単に呼び出せます。
では今週もこれにてノシ
Category: 開発日記(Unity)
【ハルシオンブログ】Photonでサーバに「ユーザの情報」「部屋の情報」を保存、取得する方法。
こんにちは、坂内でっす。
本日はPhotonのお話。
Photonサーバ側に変数って持てるんですよね。
例えば「自分のID」だったり「自分のアイテム所持数」だったり「ゲームの残り時間」だったり。
あえて"自分の"と書いたのは、ID・アイテム所持数と"ゲームの"残り時間って性質が違うものなのかなと。
ID・所持数はユーザ事の情報。
ゲームの残り時間はその部屋の情報。
って感じになりますよね。
Photonでもそれぞれユーザの情報と、カレントの部屋の情報って別に持たせられます。
【ユーザの情報】
保存する時。
こんな感じで自分のユーザ(LocalPlayer)の情報をサーバ側に保存できます。
もちろん永続的なものではなくて、その部屋が終わるまでなのかな。
取得する時。
こんな感じで取ることができます。
また、自分以外のユーザの情報はこんな感じで取れますよ。
ここのユーザがSetCustomPropertiesで保存したデータを取得できます。
【部屋の情報】
書き込む時
読み込む時
こんな感じで部屋の情報を設定・取得ができます。
って感じで、本日のPhotonの基礎的なお話は終わりです。
では、あでゅ~ノシ
本日はPhotonのお話。
Photonサーバ側に変数って持てるんですよね。
例えば「自分のID」だったり「自分のアイテム所持数」だったり「ゲームの残り時間」だったり。
あえて"自分の"と書いたのは、ID・アイテム所持数と"ゲームの"残り時間って性質が違うものなのかなと。
ID・所持数はユーザ事の情報。
ゲームの残り時間はその部屋の情報。
って感じになりますよね。
Photonでもそれぞれユーザの情報と、カレントの部屋の情報って別に持たせられます。
【ユーザの情報】
保存する時。
ExitGames.Client.Photon.Hashtable properties = new ExitGames.Client.Photon.Hashtable();
properties.Add("playerid", photonView.OwnerActorNr);
properties.Add("itemcount", 10);
PhotonNetwork.LocalPlayer.SetCustomProperties(properties);
こんな感じで自分のユーザ(LocalPlayer)の情報をサーバ側に保存できます。
もちろん永続的なものではなくて、その部屋が終わるまでなのかな。
取得する時。
int playerid;
int itemcount;
if (PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("playerid", out object idObject)) {
playerid = (int)idObject;
}
if (PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("itemcount", out object countObject)) {
itemcount = (int)countObject;
}
こんな感じで取ることができます。
また、自分以外のユーザの情報はこんな感じで取れますよ。
foreach(Player player in PhotonNetwork.PlayerList) {
if (PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("playerid", out object scoreObject)) {
int playerid = (int)scoreObject;
~~~
}
}
ここのユーザがSetCustomPropertiesで保存したデータを取得できます。
【部屋の情報】
書き込む時
ExitGames.Client.Photon.Hashtable customRoomProperties = new ExitGames.Client.Photon.Hashtable();
customRoomProperties.Add("roomtimer", 60);
PhotonNetwork.CurrentRoom.SetCustomProperties(customRoomProperties);
読み込む時
int roomtimer;
if(PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("roomtimer", out object roomtimerObject)){
roomtimer = (int)roomtimerObject;
}
こんな感じで部屋の情報を設定・取得ができます。
って感じで、本日のPhotonの基礎的なお話は終わりです。
では、あでゅ~ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】DateTimeのstring変換の一部書式は専用メソッドがあるよ。
こんにちは。
大坂です。
DateTimeをstringに変換するときに「ToString("yyyy-mm-dd")」とかで使いたい書式に変換していますが、いくつか書式については専用のメソッドがあるのでメモ。
結果はこれ

この書式にしたい場合はいちいち指定しなくてもいいので楽ですね。
ということで今週もメモ的なやつでした。
ではまたノシ
大坂です。
DateTimeをstringに変換するときに「ToString("yyyy-mm-dd")」とかで使いたい書式に変換していますが、いくつか書式については専用のメソッドがあるのでメモ。
DateTime now = DateTime.Now;
Debug.Log("ToLongDateString:" + now.ToLongDateString());
Debug.Log("ToShortDateString:" + now.ToShortDateString());
Debug.Log("ToLongTimeString:" + now.ToLongTimeString());
Debug.Log("ToShortTimeString:" + now.ToShortTimeString());
結果はこれ

この書式にしたい場合はいちいち指定しなくてもいいので楽ですね。
ということで今週もメモ的なやつでした。
ではまたノシ
Category: 開発日記(Unity)
【ハルシオンブログ】みなさんPlayfabって知ってますか?MicrosoftのBaaSなんですが、安くて使いやすいのでお勧め!
こんにちは。坂内っす。
最近Playfabをちょこちょこ使い始めました。
Playfabといわれてもピンと来る方は少ないと思います。
Microsoftのゲームに特化した BaaS(Backend as a Service) です。
もちろんUnity対応ですよ。
本日は簡単な紹介をしていきたいと思います。
どんなものかというのはこちら。
[個人からトリプル A タイトルのゲーム開発者まで。Azure PlayFab で LiveOps しよう]
https://www.slideshare.net/dmasubuchi/a-azure-playfab-liveops
今回は紹介ということで、ばしばしリンク張ります。
[公式Unityでのクイックスタート]
https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart
[PlayFabでUnityを動かしてみる -その1下準備編-]
https://qiita.com/ume67026265/items/c89b391e36855f45586f
[UnityでPlayFabのタイトルデータを取得して表示する]
https://qiita.com/_y_minami/items/3396f832d868d52bbbaf
[【PlayFab入門】UnityでPlayFabサーバーとデータの送受信]
https://questgames.hatenablog.com/entry/2019/04/28/191122
こんな感じでゲームのマスターデータとかをサーバーで管理し、Unityで使用するといったことができます。
ゲーム内で使用するアイテム等の管理がサーバでできるので、新しいアイテムの追加やアイテムのステータスの変更等がアプリの更新無しに簡単にできます。
もちろんアイテムの更新だけならNCMB等でも簡単にできますが、Playfabの良さはそのほかにも色々な機能が安価で使えます。
「でもMSさんのサービスとかお高いんでしょ~?」って思いがち。
100,000 MAUまで無料!!!(たぶんそんな感じ
これは使わないと損ですよね!
是非さわってみては?
ということで、今日はPlayfabの宣伝でした。
あでゅ~ノシ
最近Playfabをちょこちょこ使い始めました。
Playfabといわれてもピンと来る方は少ないと思います。
Microsoftのゲームに特化した BaaS(Backend as a Service) です。
もちろんUnity対応ですよ。
本日は簡単な紹介をしていきたいと思います。
どんなものかというのはこちら。
[個人からトリプル A タイトルのゲーム開発者まで。Azure PlayFab で LiveOps しよう]
https://www.slideshare.net/dmasubuchi/a-azure-playfab-liveops
今回は紹介ということで、ばしばしリンク張ります。
[公式Unityでのクイックスタート]
https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart
[PlayFabでUnityを動かしてみる -その1下準備編-]
https://qiita.com/ume67026265/items/c89b391e36855f45586f
[UnityでPlayFabのタイトルデータを取得して表示する]
https://qiita.com/_y_minami/items/3396f832d868d52bbbaf
[【PlayFab入門】UnityでPlayFabサーバーとデータの送受信]
https://questgames.hatenablog.com/entry/2019/04/28/191122
こんな感じでゲームのマスターデータとかをサーバーで管理し、Unityで使用するといったことができます。
ゲーム内で使用するアイテム等の管理がサーバでできるので、新しいアイテムの追加やアイテムのステータスの変更等がアプリの更新無しに簡単にできます。
もちろんアイテムの更新だけならNCMB等でも簡単にできますが、Playfabの良さはそのほかにも色々な機能が安価で使えます。
「でもMSさんのサービスとかお高いんでしょ~?」って思いがち。
100,000 MAUまで無料!!!(たぶんそんな感じ
これは使わないと損ですよね!
是非さわってみては?
ということで、今日はPlayfabの宣伝でした。
あでゅ~ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】型のキャストができるかできなかの判別するとき
こんにちは。
大坂です。
今日もC#なお話。
型のキャストができるかできなかの判別したいときがたまにあります。
そんなときは「typeof」や「is演算子」を使用すると思いますが、
適当にやって結果が違ってあれ?と思った事があったので違いについてのメモ。
こんなクラスがあったとき。
こんな感じで見てみます。
結果。

「typeof」の方は指定したクラスで判別して、
「is演算子」の方は基底クラスで判別するという違いがあるみたいですね!
では今週もこれにてノシ
大坂です。
今日もC#なお話。
型のキャストができるかできなかの判別したいときがたまにあります。
そんなときは「typeof」や「is演算子」を使用すると思いますが、
適当にやって結果が違ってあれ?と思った事があったので違いについてのメモ。
こんなクラスがあったとき。
public class TestBase { }
public class Test_1 : TestBase { }
public class Test_2 : Test_1 { }
public class Test_3 : Test_2 { }
こんな感じで見てみます。
TestBase test = new Test_2();
bool isTypeofTestBase = typeof(TestBase) == test.GetType();
bool isTypeofTest_1 = typeof(Test_1) == test.GetType();
bool isTypeofTest_2 = typeof(Test_2) == test.GetType();
bool isTypeofTest_3 = typeof(Test_3) == test.GetType();
Debug.Log("isTypeOfTestBase:" + isTypeOfTestBase);
Debug.Log("isTypeOfTest_1:" + isTypeOfTest_1);
Debug.Log("isTypeOfTest_2:" + isTypeOfTest_2);
Debug.Log("isTypeOfTest_3:" + isTypeOfTest_3);
bool isTestBase = test is TestBase;
bool isTest_1 = test is Test_1;
bool isTest_2 = test is Test_2;
bool isTest_3 = test is Test_3;
Debug.Log("isTestBase:" + isTestBase);
Debug.Log("isTest_1:" + isTest_1);
Debug.Log("isTest_2:" + isTest_2);
Debug.Log("isTest_3:" + isTest_3);
結果。

「typeof」の方は指定したクラスで判別して、
「is演算子」の方は基底クラスで判別するという違いがあるみたいですね!
では今週もこれにてノシ
Category: 開発日記(Unity)
【ハルシオンブログ】Photon(PUN2)得意な方教えてください!Photonでプレイヤーがアイテムとかとった時の処理について
こんにちは。坂内っす。
本日はPhotonのお話。
Photonを使っている人ならわかるかもしれない。
PhotonNetwork.Instantiateで作成したものは、それを作ったオーナーしかPhotonNetwork.Destroyができない。
これPhotonの常識。
ここまではいい。
AさんBさんの二人でPhotonを使って対戦している時に、アイテムXが出るとしよう。
AさんがアイテムXをとった時には以下のようにしています。
[ItemBase.cs] アイテムが自分のキャラに触れたときの処理
TransferOwnerShipをすることで、アイテム自体のオーナーを取得したユーザに変更し、最後にアイテムのオブジェクトを消しています。
ここで問題があります。
①この方法でいいのか?
②A、Bの二人が同時にアイテムに触れた場合にエラーがでる。
まず①ですが、こんな感じでやってますが、この方法で消す処理はいいのか?
もっといい方法があるのか?
あるなら教えてフォトンマスター!
②二人同時でアイテムに触れると、2ユーザからDestroyが呼ばれて落ちる。
消すために、オーナーシップを触ったユーザに移し、Destroyをしているため、複数人同時に触ると誰かがエラーになってしまうんです。
厳密にはこんなエラーがでてるので、「AさんがDestroyしてるけど、PhotonViewがもうないよ」って意味ですよね。
これの解決法っていいのありますか?
実は、触ったユーザにオーナー権を渡すのではなく、RPCで消す処理を投げて、MasterClientが消すとかの方がいいのかな?
この辺良く分かってないんですよね。
ってことで、素敵な解決法お待ちしています!
Photonなら任せろ!って方教えて!
ってことで、色々試してみます!あでゅ~ノシ
本日はPhotonのお話。
Photonを使っている人ならわかるかもしれない。
PhotonNetwork.Instantiateで作成したものは、それを作ったオーナーしかPhotonNetwork.Destroyができない。
これPhotonの常識。
ここまではいい。
AさんBさんの二人でPhotonを使って対戦している時に、アイテムXが出るとしよう。
AさんがアイテムXをとった時には以下のようにしています。
[ItemBase.cs] アイテムが自分のキャラに触れたときの処理
private void OnCollisionEnter(Collision col) {
if (col.gameObject.tag == "Player") {
// 触ったプレイヤーを取得
Player player = col.gameObject.GetComponent<PlayerController>();
if (player.photonView.IsMine) {
photonView.TransferOwnership(player.photonView.OwnerActorNr);
// アイテムの獲得
player.GetItem(アイテムX);
PhotonNetwork.Destroy(gameObject);
}
}
}
TransferOwnerShipをすることで、アイテム自体のオーナーを取得したユーザに変更し、最後にアイテムのオブジェクトを消しています。
ここで問題があります。
①この方法でいいのか?
②A、Bの二人が同時にアイテムに触れた場合にエラーがでる。
まず①ですが、こんな感じでやってますが、この方法で消す処理はいいのか?
もっといい方法があるのか?
あるなら教えてフォトンマスター!
②二人同時でアイテムに触れると、2ユーザからDestroyが呼ばれて落ちる。
消すために、オーナーシップを触ったユーザに移し、Destroyをしているため、複数人同時に触ると誰かがエラーになってしまうんです。
厳密にはこんなエラーがでてるので、「AさんがDestroyしてるけど、PhotonViewがもうないよ」って意味ですよね。
Ev Destroy Failed. Could not find PhotonView with instantiationId 15. Sent by actorNr: 1
これの解決法っていいのありますか?
実は、触ったユーザにオーナー権を渡すのではなく、RPCで消す処理を投げて、MasterClientが消すとかの方がいいのかな?
この辺良く分かってないんですよね。
ってことで、素敵な解決法お待ちしています!
Photonなら任せろ!って方教えて!
ってことで、色々試してみます!あでゅ~ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】整数を2進数、8進数、16進数にしたいとき
こんにちは。
大坂です。
10進数を2進数に変換したかったときのメモです。
やることは簡単で「Convert.ToString」を使うだけです。
8進数や16進数にもできるのでついでに。
結果

注意点としては第2引数に指定できるのが「2」「8」「10」「16」だけです。
とかやって実行するとエラーになりますね。

ということで2進数への変換とかは簡単にできますよって話でした。
ではまたノシ
大坂です。
10進数を2進数に変換したかったときのメモです。
やることは簡単で「Convert.ToString」を使うだけです。
8進数や16進数にもできるのでついでに。
int test = 23;
Debug.Log("2進数:" + Convert.ToString(test,2));
Debug.Log("8進数:" + Convert.ToString(test,8));
Debug.Log("16進数:" + Convert.ToString(test,16));
結果

注意点としては第2引数に指定できるのが「2」「8」「10」「16」だけです。
int test = 23;
Debug.Log(Convert.ToString(test,5));
とかやって実行するとエラーになりますね。

ということで2進数への変換とかは簡単にできますよって話でした。
ではまたノシ
Category: 開発日記(Unity)
【ハルシオンブログ】最近頑張って64対応したのに、ポケットガールがGooglePlayからけされたんですけど?
こんにちは。坂内です。
ポケットガールがGooglePlayから消されました。
え?
こんなメールを朝いただきまして、震えております。

え?なんて?

ちゃんとエビデンスまで用意してくださってました。
あぁ Adの表記がないというのですね。
いきなりくるよねー 今まで数年なんもなかったのに、くるよねー
あ、最近64対応のためにアプデしたから見られたんですね。
某アドフリさんの動画ネイティブを使う方は注意してください。
アドフリくんに確認したところ、SDKでそのような表記を追加するのは無理らしく、自分でちゃんと書いてね。
っていう対応でした。
ってことで、こんな感じで「AD」って文字をいれて、再審査投げてみました。

結果はいかに!?
これでも通らなかったら、動画ネイティブ外してやんよ!
ポケットガールがGooglePlayから消されました。
え?
こんなメールを朝いただきまして、震えております。

え?なんて?

ちゃんとエビデンスまで用意してくださってました。
あぁ Adの表記がないというのですね。
いきなりくるよねー 今まで数年なんもなかったのに、くるよねー
あ、最近64対応のためにアプデしたから見られたんですね。
某アドフリさんの動画ネイティブを使う方は注意してください。
アドフリくんに確認したところ、SDKでそのような表記を追加するのは無理らしく、自分でちゃんと書いてね。
っていう対応でした。
ってことで、こんな感じで「AD」って文字をいれて、再審査投げてみました。

結果はいかに!?
これでも通らなかったら、動画ネイティブ外してやんよ!
Category: 開発日記(Unity)
【ハルシオンブログ】C#7だとoutパラメータの変数の書き方変えられるんですね
こんにちは。
大坂です。
今週も適当にC#のお話。
なんかoutを使うときに変数宣言して書くのが嫌いだったんですが、C#7から違う書き方ができるんですね。
もともとこんな感じだったやつ。
こうかけるようになってますね。
先にoutで使用する変数の宣言をしないといけなかったのがoutのところに型を指定できるようになってますね。
大した差ではないですけど、こっちのほうが好みです。
ではでは今週もこれでノシ
大坂です。
今週も適当にC#のお話。
なんかoutを使うときに変数宣言して書くのが嫌いだったんですが、C#7から違う書き方ができるんですね。
もともとこんな感じだったやつ。
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 10.0f))
{
Debug.Log(hit.collider.gameObject.transform.position);
}
こうかけるようになってますね。
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, out RaycastHit hit, 10.0f))
{
Debug.Log(hit.collider.gameObject.transform.position);
}
先にoutで使用する変数の宣言をしないといけなかったのがoutのところに型を指定できるようになってますね。
大した差ではないですけど、こっちのほうが好みです。
ではでは今週もこれでノシ
Category: 開発日記(Unity)
| h o m e |