0
0

【Unity】PUN2を学習する オブジェクト同期の仕方や初期位置の設定

Last updated at Posted at 2023-12-09

この記事は、【完走したい】楽しくいろいろやる Advent Calendar 2023の6日目の記事です。

3日間かけて簡単なエアホッケーを作ります。2日目です。
オブジェクト、キャラの同期の仕方を学びます。

キャラを同期させる

キャラを同期させるためには、

1.Resourcesフォルダを作成

2.用意しておいたオブジェクトを入れる(これがPrefab Assetに変換されます。)

3.ルーム作成したときにクローンが呼び出されるようにする

この3ステップが必要なようです。

解説

1.Create>Folderで新しいフォルダーを作る
名前を「Resources」に変えればOKみたいです。
2.用意しておいたオブジェクトを作ったフォルダに入れ込む
Hierarchyに作っておいたオブジェクトでも、どっかから持ってきたよくわからんオブジェクトでも入れば動くっぽいです。
フォルダに入れておきましょう。
3.昨日書いたスクリプト(サーバー接続、ルーム作成)を書き換える
ルームに入った時点でInstantiate(オブジェクトの生成)が呼ばれるようにします。
今回はホッケーの操作するやつ(Cube)が生成されるようにします。
Resourcesに入れておいたものであれば生成できるっぽいです。
public override void OnJoinedRoom()に以下を追加します。

  PhotonNetwork.Instantiate("Cube", new Vector3(0,0,0), Quaternion.identity);

後、Photon Transform Viewなるものをくっつけておきます。
PrefabなCubeにAdd Componentから足しておきます。
これでオブジェクトを同期できました。

プレーヤーの位置を調整する

今、プレーヤーは全員初めに(0,0,0)の位置に来るようになっています。しかし、今回はエアホッケーなので、自分は下側、相手は上側に来なければなりません。
図)
2023図.png

ということで、プレイヤーごとにPrefabなcubeが生成される場所を変えます。
プレイヤーは、ルームに入ると1から順番に数字が割り振られます。
photonView.OwnerActorNrに自身の数字が入っています。
しかし、ルームに入ってオブジェクトが生成されるときに変更できませんでした。
そこで、新しく別のスクリプトを作り、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class TFControll : MonoBehaviourPunCallbacks
{
    // Start is called before the first frame update
    void Start()
    {
        if (photonView.IsMine)
        {
            if (photonView.OwnerActorNr == 1)
            {
                this.gameObject.transform.position = new Vector3(0, 4, 0);
            }
            else
            {
                this.gameObject.transform.position = new Vector3(0, -4, 0);
            }

        }

    }
    // Update is called once per frame
    void Update()
    {
        
    }

}

オブジェクトが生成された後にこのスクリプトを読み込んだ段階で位置を移動させます。
こんな感じで、void startの段階で自身のプレイヤーIDに応じて位置を変化させました。
画像はとってなかったけど、ちゃんと動きました。

キーボードの矢印キーで移動ができるようにする

↑上のスクリプトのUpdate()に、以下のコードを追加しました。

if (photonView.IsMine)
        {
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                this.transform.Translate(-0.1f, 0.0f, 0.0f);
            }

            if (Input.GetKey(KeyCode.RightArrow))
            {
                this.transform.Translate(0.1f, 0.0f, 0.0f);
            }
        }

相手のものまで動かさないように、IsMineを使っています。

参加者数を取得し、ゲームを開始する

参加者数は、'PhotonNetwork.CountOfPlayersInRooms'を用いることで調べられるそうです。
参加人数が二人になったらゲームが開始されるようにします。
参加者が二人になった時にGameStartに飛びます。

      if (PhotonNetwork.CountOfPlayersInRooms == 2)
        {
            GameStart();
        }

    }
    public void GameStart()
    {

    }

とりあえず今日はここまで

まとめ

オブジェクト同期の仕方を学んだ
参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0