Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

MLAPI その6

サーバの CPU 使用率がめちゃくちゃ上がっているので、全体の FPS を下げる。
シーン内に SceneManager を作って、Application.targetFrameRate を設定しておく。

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

public class SceneManager : MonoBehaviour
{
    private void Awake()
    {
        Application.targetFrameRate = 60;
    }
}

(あと、Server Build にチェックを入れるのと、コマンド実行で -batchmode をつけるのとつけないのと、その辺の差がよくわからなかった。とりあえず Server Build でできたバイナリをそのまま叩くで OK なのかな?)

(ローカルで開発するときは Connect Address を手動で 127.0.0.1 に戻しておく)


PlayerCube どうしでぶつかることができるようにするために、Rigidbody をつけた。



あといろいろやってたらうまく動かなくなったので書けることが少ない。

MLAPI その5

Linux サーバ上で、サーバとして実行できるようにする。
前述のとおり、ホスト・サーバ・クライアントの 3 種類があり、ホスト=サーバ+クライアントである。
ローカルでの開発はホストとクライアントで OK だけど、実際に多人数で遊ぶためには、サーバがあるのが良い。

シーン内に空の GameObject をつくって、ServerManager として、ServerManager スクリプトを作ってアタッチ。

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

public class ServerManager : MonoBehaviour
{
    void Start()
    {
#if UNITY_SERVER
        Debug.Log("Start Server");
        MLAPI.NetworkingManager.Singleton.StartServer();
#endif
    }
}

一番簡単なので、接続設定を固定で埋め込む。NetworkingManager についている Unet Transport の Connect Address を「127.0.0.1」からサーバの IP アドレスを入れておく。この辺はアプリから自由入力できるようにしたいな。

f:id:rightgo09:20201205231602p:plain


サーバ用のビルドは、Unity Hub で Linux Build Support(Mono) をインストールして、Target Platform を Linux、Server Build にチェックを入れてビルドで OK だった。


できた生成ファイルたちを Linux サーバ上にもっていって、コマンド実行する。

$ ./run.x86_64
Set current directory to /home/r9/R9MLAPI_Server
Found path: /home/r9/R9MLAPI_Server/run.x86_64
Mono path[0] = '/home/r9/R9MLAPI_Server/run_Data/Managed'
Mono config path = '/home/r9/R9MLAPI_Server/run_Data/MonoBleedingEdge/etc'
Initialize engine version: 2019.4.14f1 (4037e52648cd)
[Subsystems] Discovering subsystems at path /home/r9/R9MLAPI_Server/run_Data/UnitySubsystems
Forcing GfxDevice: Null
GfxDevice: creating device client; threaded=0
NullGfxDevice:
    Version:  NULL 1.0 [1.0]
    Renderer: Null Device
    Vendor:   Unity Technologies
Begin MonoManager ReloadAssembly
- Completed reload, in  0.079 seconds
UnloadTime: 0.820268 ms
Start Server 
(Filename: ./Runtime/Export/Debug/Debug.bindings.h Line: 35)

Unity 上でも実行して Start Client を押すと、うまく動いた。


参考
docs.unity3d.com

MLAPI その4

カメラがアレなので、上空から映すように位置をいい感じに移動する。

プレイヤの Cube に PlayerCubeController のスクリプトを作ってアタッチしておく。
通常の MonoBehaviour クラスではなくて、MLAPI.NetworkedBehaviour を継承しておく。
NetworkedObject をアタッチしているので、これでいろいろ操作する。

public class PlayerCubeController : MLAPI.NetworkedBehaviour
{
}

プレイヤの Cube が中央に埋まった形で出現してしまうので、ランダムに出てくるようにする。

public class PlayerCubeController : MLAPI.NetworkedBehaviour
{
    private void Start()
    {
        transform.position = new Vector3(Random.Range(-9, 9), 0.5f, Random.Range(-9, 9));
    }
}

Awake() だと、クライアントの 2 台目としてつながったとき、ホストの PlayerCube も移動してしまい、それぞれの画面で見た目が変わってしまった。
Start() なら大丈夫だった。

WASD で移動できるようにする

普通に Update() に書くと、他の PlayerCube にも影響するので、自分だけの PlayerCube だけを動かすようにする必要がある。

    private Vector3 velocity;
    private float moveSpeed = 5.0f;

    private void Update()
    {
        // これが大事
        if (!IsOwner)
        {
            return;
        }

        velocity = Vector3.zero;
        if (Input.GetKey(KeyCode.W)) velocity.z += 1;
        if (Input.GetKey(KeyCode.A)) velocity.x -= 1;
        if (Input.GetKey(KeyCode.S)) velocity.z -= 1;
        if (Input.GetKey(KeyCode.D)) velocity.x += 1;
        velocity = velocity.normalized * moveSpeed * Time.deltaTime;
        if (velocity.magnitude > 0)
        {
            transform.position += velocity;
        }
    }

これでそれぞれの画面で、それぞれの PlayerCube が動くようになった。

f:id:rightgo09:20201204233649g:plain

参考
http://sasanon.hatenablog.jp/entry/2017/09/17/041612