概要
Strix Unity SDKについて、やりたい事別にヘルプを作りました。
初心者が良く分からずに書いているので変な記述があればTwitterで教えてください.
分からないこと等がある場合は、Twitterでリプライを送ってくれれば分かる範囲でお答えします。でも自分自身初心者なので難しい事は分からないかもしれません。
最初に絶対読め
スクリプトの先頭には必ず
using SoftGear.Strix.Client.Core.Auth.Message;
using SoftGear.Strix.Client.Core.Error;
using SoftGear.Strix.Client.Core.Model.Manager.Filter;
using SoftGear.Strix.Client.Core;
using SoftGear.Strix.Unity.Runtime;
using SoftGear.Strix.Net.Logging;
using SoftGear.Strix.Unity.Runtime.Event;
を付けておいてください。Strixの命令をプログラムが理解するための名前空間の宣言です。良く分からなかったらコピペしといてくだい。
APIリファレンスを読むと、どの命令がどの名前空間なのかがわかるのでたくさん宣言するのが気持ち悪い方は各自調べてください。(一応名前空間の宣言は多くてもそんなに実行速度に違いが出ないって言われています)
あと最初の方にある
public class hoge : MonoBehaviour {
を
public class hoge : StrixBehaviour {
に書き換えておいてください。
あと下の動画は必ず見てください。絶対見てください
HPやライフなどの変数を同期したい
[StrixSyncField]を使えば可能です。
変数を宣言する前にこれを加えることで変数を共有できるようになります。ほかのスクリプトから変更できないようにするために、必ず「isLocal(自分の持っているスクリプトか。ほかのクライアントからクローンされたものではないかを判定する)」を付けてください。
[StrixSyncField]
public int myhealth;
void Start() {
if(isLocal){
myhealth = 10;
}
}
全員にメッセージを送りたい(RpcToAll)
RpcToAllを使います。別にメッセージでなくとも全員にやらせたい処理があればこれを使うことで実現できます。
public class MsgScript : StrixBehaviour
{
public Text _text;
// Start is called before the first frame update
void Start()
{
RpcToAll("Msg", "こんにちは");
}
[StrixRpc]
public void Msg(string str){
_text.text = (str);
Invoke("ers", 5f);
}
void ers(){
_text.text = ("");
}
}
自分の名前が知りたい(GetName)
実行するとき、ゲームのプレイ部屋に接続している必要があります。isLocalを付けないと他のクライアントで動いているスクリプトと名前の同期がうまく行かなくなります。
他にもこのselfRoomMemberで自分についての色々な接続情報が取得できます。
[StrixSyncField]
public string myname;
void Start() {
if(isLocal){
myname = StrixNetwork.instance.selfRoomMember.GetName();
}
}
自分のUIDが知りたい(GetUID)
UIDを使えばプレイヤー1人1人を識別できて便利です
GetUIDで取得できます。既定だとUIDという型で帰ってくるのでサンプルでは扱いやすいようにStringに変換しています。 もし取得したUIDを使ってStrixに命令を出す場合は「.ToString()」を外してください。
他にもこのselfRoomMemberで自分についての色々な接続情報が取得できます。
[StrixSyncField]
public string myuid;
void Start() {
if(isLocal){
myuid = StrixNetwork.instance.selfRoomMember.GetUid().ToString();
}
}
チャット機能を実装したい
(参考にさせて頂きました→https://junyablog.site/post-4034/)
下のスクリプトを参考にしてください。チャットUIは下記の構成で作り、スクリプトのインスペクターからアタッチしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using SoftGear.Strix.Unity.Runtime;
using SoftGear.Strix.Client.Match.Room.Model;
using System.Linq;
using UnityEngine.EventSystems;
public class Chat : StrixBehaviour
{
public List<string> chatLog = new List<string>();
public GameObject send;
public GameObject chatlog;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Return))
{
send.GetComponent<InputField>().Select();
}
}
[StrixRpc]
void GetChat(string senderName, string senderWord)
{
chatLog.Add(senderName + " : " + senderWord);
for(int i = 0; i < chatLog.Count; ++i)
{
Debug.Log(chatLog[i]);
}
if (chatLog.Count > 10)
{
chatLog.RemoveAt(0);
}
chatlog.GetComponent<Text>().text = "";
for (int i = chatLog.Count - 1; i >= 0; --i)
{
chatlog.GetComponent<Text>().text = chatlog.GetComponent<Text>().text + "\n" + chatLog[i];
}
}
public void sendchat(){
if(send.GetComponent<InputField>().text == ""){}else{
RpcToAll("GetChat", StrixNetwork.instance.selfRoomMember.GetName(), send.GetComponent<InputField>().text);
send.GetComponent<InputField>().text = ("");
}
}
}
誰かがルームに入室した時にイベントを起こしたい
イベントハンドラっていうのをつかえば出来るみたいです 自分もちょっとイベントハンドラって何ですか?って感じなんですけどとりあえず下記のソースコードで出来ることを確認しています。ルームに関するほかのイベントも簡単な書き換えで実装できます。イベントの種類については下記リンクを参照してください。
2021-02-17追記 入室した時のイベントを無効化したい場合は3行目の「+=」を「-=」に置換してください。
参考リンク:https://www.strixengine.com/doc/unity/guide/ja/unitysdk/matchmaking/roomevents.html
void Start()
{
StrixNetwork.instance.roomSession.roomClient.RoomJoinNotified += PlayerJoined;
}
void PlayerJoined(object sender){
//ここに誰かが入室した時に行う処理を書きます
}
ゲームサーバーに接続されているか知りたい
ゲームサーバーに関する情報はStrixNetwork.instance.masterSessionから取得できます。このページが参考になる?のかな?→https://www.strixengine.com/doc/unity/api/html/T_SoftGear_Strix_Unity_Runtime_Session_AbstractSession.htm
if(StrixNetwork.instance.masterSession.IsConnected){
Debug.Log("ゲームサーバーに接続されています。");
}else{
Debug.Log("ゲームサーバーに接続されていません。");
}
ルームに入室しているか知りたい
オンラインモードとオフラインモードで同じスクリプトを共有していて、オンライン時にのみ処理をしたい場合に。
if(StrixNetwork.instance.roomSession.IsConnected){
Debug.Log("ルームに入室しています。");
}else{
Debug.Log("ルームに入室していません。");
}
ルームに入室している人数を知りたい
~人そろったらゲーム開始!みたいな処理を実装したい場合に。
int member_count = StrixNetwork.instance.room.GetMemberCount();
Debug.Log(member_count + "人入室しています。");
Strixの仕様について
・WebGLビルド非対応
・StrixAnimationSynchronizerはTriggerで動くAnimationの同期に対応していないので、別途StrixRpcなどでSetTriggerを実行しないといけない(バグ?)