【第05日目】UnityとPUN2で3Dのカードを触る、配る、対面で座る

こんにちは、今日はカードを触れるようになろうと思います。

考えると色々分らないことがあるので、現状で考えられる問題点を書き出しています。

1.場札を触る

2.カードを引く

3.手札の扱い

4.山札(ライブラリ)の考え方

 

取り急ぎは、1の場札を触る事が出来るようにしたいと思います。

UnityとPhotonでテーブル上で3dのカードを触る

まずはテーブルを適当に作って、その上のカードを触る練習をします。

マウスをドラッグしてオブジェクトを動かす事はこのウェブサイトを参考にコードをいじりました。

カードをマウスで掴んで場所を移動して離すという事をできるようにします。

UnityとPhotonで3dカードをドラッグアンドドロップする

まずは、カードとテーブルをボックスで適当に作って、マテリアルを付けます。

MouseDrag.csというスクリプトをカードにつけてあげています。

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

public class MouseDrag : MonoBehaviour
{
    void OnMouseDrag()
    {
        //Cubeの位置をワールド座標からスクリーン座標に変換して、objectPointに格納
        Vector3 objectPoint
            = Camera.main.WorldToScreenPoint(transform.position);

        //Cubeの現在位置(マウス位置)を、pointScreenに格納
     

        Vector3 pointScreen
             = new Vector3(Input.mousePosition.x,
                           Input.mousePosition.y,
                           objectPoint.z);

        //Cubeの現在位置を、スクリーン座標からワールド座標に変換して、pointWorldに格納
        Vector3 pointWorld = Camera.main.ScreenToWorldPoint(pointScreen);
        //pointWorld.z = transform.position.z;
        pointWorld.y = 4.4117f;
        //Cubeの位置を、pointWorldにする
        transform.position = pointWorld;
    }
}

 

この4.4117という数字は、カードを掴んだ時の高さです。テーブルに合わせて設定します。

カードにはPhotonViewとPhotonTransformViewを付けてあげています。

RigidBodyとColliderはカードにもちろんつけて衝突が起こるようにしています。

 

ドラッグでカードを浮かせて、ドロップでカードを置くことができます。

ちなみに、後で詰まった時に分かったのですが、Camera.mainというのはMainCameraタグが付いていないとNullを返してしまうので、これを使用する時は、カメラのタグに注意です。

UnityとPhotonで3dのオブジェクトのマウスクリックを検知する

 

まずは、このサイトを参考にオブジェクトのクリックを検知して、それをトリガーにカードをインスタンス化することを考えます。

似たような内容ですが、このサイトも参考にしています。

PhysicsRaycasterが必要なようなので、それをFirstPersonControllerのカメラに追加します。

それからクリックを検知したいオブジェクトにEvent.csを付けます。

これでクリックを検知してデバッグログに流せるようにします。

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

public class Event : MonoBehaviour
{
    GameObject ClickObject;

    public void click()
    {
        ClickObject = this.gameObject;
        Debug.Log(ClickObject + "をクリックしました");
    }
}

 

この関数が呼ばれるためにEventTriggerを用意する必要があります。

EventTriggerというコンポーネントを付けて、Eventをドラッグアンドドロップします。

AddNewEventTypeからPointerClickを選択します。

Event>clickからパブリック関数を呼ぶように指定します。

 

それからシーンにEventSystemがあることを確認します。

無い場合は追加します。

これでクリックできるはずなのですが、私の場合はできませんでした。

 

クリックが検知されない理由をいろいろ考えて、試行錯誤したところUIによってブロックされているという事が分かりました。

UIをオフにするとクリックが検知されます。

RaycasterのMaskLayerでUIをオフにしてもUIにブロックされてしまいます。

ここで、詰まったので、有識者の方にアドバイスを求めました。

すると、RaycastTargetにチェックが入っているとUIがブロックしてしまうようで、

表示されているUIで邪魔になるもののRaycastTargetをことごとくオフにすることで、Rayの干渉を防ぐことが出来ました。

これで、やっとデバッグログにUIありでマウスクリックを検知されたことを確認することができました。

UnityとPhotonでオブジェクトのマウスクリックによってカードを配る

デバッグログにテキストを流す代わりに、PHOTONでカードプレファブをInstantiateしてみます。

Resourceフォルダにはあらかじめ、カードオブジェクトにPhotonViewとPhotonTransformViewをくっつけて格納しておきます。

Event.csを下記のように書き換えて、SpawnPointにキューブを配置しTransformをドラッグアンドドロップで取得しておきます。

using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Event : MonoBehaviour
{
    GameObject ClickObject;
    [SerializeField] Transform spawnPoint;

    public void click()
    {

        GameObject cardCopy = (GameObject)PhotonNetwork.Instantiate("Card01", spawnPoint.position, spawnPoint.rotation, 0);
        //ClickObject = this.gameObject;
        //Debug.Log(ClickObject + "をクリックしました");
    }
}

 

これで、カードを配る事が出来ました。

これをPHOTONでマルチユーザーで触ることを次に考えます。

二人で対戦プレイ用に着席できるようにする

カードゲームと言えば対面ですよね。

お互いが対面になるようにカメラを固定して、自分のカードは自分の陣地に配られるようにしたいものです。

この時に、まずは着席しているカメラをオンにするために、置いてあるスフィアと当たり判定を使うことにします。

 

当たり判定についてはこのサイトを参考にしました。

カメラのオンオフについてはこのサイトを参考にしました。

まずはNewCameraCollisionというスクリプトを作ります。

プレイヤーというタグのついたオブジェクトとぶつかった時にぶつかったプレイヤーオブジェクトを非表示にします。

そして、Sphereについている対面カメラCamera01, Camera02を着けたり消したりできるようにしておきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class NewCameraCollision : MonoBehaviour
{
    [SerializeField] GameObject Camera01;
    [SerializeField] GameObject Camera02;    

    //OnCollisionEnter()
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("collision");

        if (collision.gameObject.tag == "Player")
        {
            Debug.Log("collision");

            collision.gameObject.SetActive(false);
        }

        Camera01.SetActive(true);
        Camera02.SetActive(false);
    }
}

この時、まずは、FirstPersonControllerがPlayerタグになっているかを確認します。

それから、RigidBody、ColliderをSphereにつけておきます。

 

先ほど上の方で書きましたが、Camera.mainがnullを吐かないようにMainCameraタグをつけます。

それから、Rayを検知するためにカメラにはRayCasterが必要ですね。

 

カメラのオーディオリスナーが有効だと警告が出るので、対面カメラは両方ともFalseの状態で始めます。

対面で対戦プレイが出来そうです。

おわりに

今日は、UnityとPhotonでカードの準備と対戦プレイのセッティングまでを行いました。

これから、カードで戦う事を想定していろいろな操作を仕込んでいきたいと思います。

 

なかなか、難しいとは思いますが、今後も対戦プレイができるように頑張っていきます。

それでは、また!

 

おすすめの記事