ヤマコーブログ

五流ゲームプログラマー山木光石がUnityでなんかゲームを作るブログ。 なお言語はC#がメインです。 基本的に備忘録とかになります。

Category:Unity > PSMove

前回のPSMoveを利用した記事の続きです。
すでに、1本の場合の設定は済んでいるものとして解説します。


まず、PSMove2本目をペアリングしてやる必要があります。
このペアリングは、1本目と全く同じようにすれば大丈夫です。


そしてUnityから起動すると、 1本目(以降1コンと呼びます)と2本目(2コン)はどちらも認識されます。
やったね!



しかし、 そのままだと、入力内容が1コンか2コンかわからないため、処理の区別が付けられません。

そこで、ちょちょっと作ってみました。

    //instanceID
    int conid1 = 0;
    int conid2 = 0;
    void setControllerID(int instanceID){
                if (conid1 == 0){
                    conid1 = instanceID;
                }else{
                        if (conid2 == 0){
                            conid2 = instanceID;        
                        }
                }
        }
        
        
        int  getControllerID(int instanceID){
                if(conid1 == instanceID){
                    return 1;            
                }else{
                    if (conid2 == instanceID){
                        return 2;        
                    }else{
                        return 0;        
                    }                        
                }
        }
    
 
そして、各コントローラで
setControllerID
(move.GetInstanceID());

を1回ずつ呼びます。これでどちらのコントローラかを判別することができますね。
インスタンスIDはコントローラごとに別の値(ただし、実行するたびに変わる)を持っているので、これで判別します。先にセットしたほうが1コンになります。


で、それを使ったonGUIサンプルを置いておきます。
        private bool front1,front2 = false;
        private bool back1,back2 = false;
        private bool left1,left2 = false;
        private bool right1,right2 = false;


    void OnGUI() 
    {        
        if (moves.Count > 0
        {
            for (int i = 0i < moves.Counti++) 
            {
                //コントローラ1の処理    
                if(getControllerID (moves[i].GetInstanceID()) == 1){
                    //前に倒す
                    if (moves[i].Acceleration.z > 0.4) {
                        front1 = true;    
                    }else{
                        front1 = false;    
                    }

                    //後ろに倒す
                    if (moves[i].Acceleration.z < -0.4) {
                        back1 = true;    
                    }else{
                        back1 = false;    
                    }

                    //leftに倒す
                    if (moves[i].Acceleration.x > 0.5) {
                        left1 = true;    
                    }else{
                        left1 = false;    
                    }
                    //rightに倒す
                    if (moves[i].Acceleration.x < -0.5) {
                        right1 = true;    
                    }else{
                        right1 = false;    
                    }

                    
                }
                
            
                                
                
                //コントローラ2の処理    
                if(getControllerID (moves[i].GetInstanceID()) == 2){
                    //前に倒す
                    if (moves[i].Acceleration.z > 0.4) {    
                            front2 = true;    
                    }else{
                            front2 = false;    
                    }

                    //後ろに倒す
                    if (moves[i].Acceleration.z < -0.4) {
                        back2 = true;    
                    }else{
                        back2 = false;    
                    }
                    
                    //leftに倒す
                    if (moves[i].Acceleration.x > 0.5) {
                        left2 = true;    
                    }else{
                        left2 = false;    
                    }
                    //rightに倒す
                    if (moves[i].Acceleration.x < -0.5) {
                        right2 = true;    
                    }else{
                        right2 = false;    
                    }


                }
                

                
                
                //どちらも前に倒している場合全身
                if (front1 && front2) {
                        transform.Translate(new Vector3(0,0,speed * moves[i].Acceleration.z) * Time.deltaTime);
                }
                                        
                //後ろに進む
                if (back1 && back2) {
                    transform.Translate(new Vector3(0,0,speed * moves[i].Acceleration.z) * Time.deltaTime);
                }        

                //右にTurn
                if (front1 & back2) {
                    Quaternion deltaRotation = Quaternion.Euler(eulerAngleVelocity * Time.deltaTime * 0.4f);
                    rigidbody.MoveRotation(rigidbody.rotation * deltaRotation);
                }

                //左にTurn
                if (back1 & front2) {
                    Quaternion deltaRotation2Quaternion.Euler(-eulerAngleVelocity * Time.deltaTime * 0.4f);
                    rigidbody.MoveRotation(rigidbody.rotation * deltaRotation2);
                }


            
                //左に進む
                if (left1 && left2) {
                    transform.Translate(new Vector3(-speed * moves[i].Acceleration.x * Time.deltaTime,0,0));
                }
                //右に進む
                if (right1 && right2) {
                    transform.Translate(new Vector3(-speed * moves[i].Acceleration.x * Time.deltaTime,0,0));
                }




            }
        }


    }



動作説明;
同時に前で前進。 同時に後で後退。 同時に左で左に進む。 同時に右で右に進む。 1コン前で2コン後で右に転回。 1コン後で2コン前で左に転回。

https://twitter.com/koseki_yamaki/status/461452135570235392

コメントが一部ルー大柴みたいになってますが、MonoDevelopも併用してたのでこうなってます。読み替えてください。

もうちょっとマシに書ける気もしますが、私は所詮この程度のレベルです……。

Oculus Riftを使ったゲームでは、キーボードやコントローラなどの手元が見えない為、それまでとは違うコントローラを使ったほうが良い。

そのために選んだコントローラは「PlayStationMove(PSMove)」。
PSMoveには、加速度センサ、ジャイロセンサ、地磁気センサの3種類のセンサーがついており、
PSMoveを動かすことにより、ゲームを操作することが出来る。
ただし、PlayStationEyeと連携して、ポインティングデバイスとして扱うことはできない


必要なもの
Mac OSXのPC(Windowsではできない模様)
Unity Pro
PlayStationMove

あるとすごく便利なもの
PSMove用充電器
※PSMoveは、PCとの接続で充電できないようなので、別途充電器を用意したほうが便利。
 というかないと非常に不便。

導入に関してはこちらのサイトを参考にしました。
Oculus用操作デバイスの検討(PSMove) 

 



導入後、そのサンプルを実行すると、各種ボタンを入力出来る状態になります。
ただし、モーションに関しては何も書いていないので、ちょっとしたサンプルを書いておきます。

前に倒すと前に進む、後ろに倒すと後ろに進む。
右に倒すと右に転回、左に倒すと左に転回します。
moves[i].Acceleration.z > 0.4のように書いている理由は、
センサーは動かしていなくても、微小な入力が発生し続けるからです。

        void OnGUI() 
    {        
        if (moves.Count > 0) 
        {
            for (int i = 0; i < moves.Count; i++) 
            {            
                //前に進む
                if (moves[i].Acceleration.z > 0.4) {
                        transform.Translate(new Vector3(0,0,speed * moves[i].Acceleration.z) * Time.deltaTime);            
                }
                                    
                //後ろに進む
                if (moves[i].Acceleration.z < -0.4) {
                    transform.Translate(new Vector3(0,0,speed * moves[i].Acceleration.z) * Time.deltaTime);
                }        
                //左に曲がる
                if (moves[i].Acceleration.x > 0.5) {
                    Quaternion deltaRotation2= Quaternion.Euler(-eulerAngleVelocity * Time.deltaTime * moves[i].Acceleration.x);
                    rigidbody.MoveRotation(rigidbody.rotation * deltaRotation2);
                }

                //右に曲がる
                if (moves[i].Acceleration.x < -0.5) {
                    Quaternion deltaRotation = Quaternion.Euler(-eulerAngleVelocity * Time.deltaTime * moves[i].Acceleration.x);
                    rigidbody.MoveRotation(rigidbody.rotation * deltaRotation);
                }
            
                                

                
            }
        }
    }

https://twitter.com/koseki_yamaki/status/460420471133978624/photo/1


次は、「PSMoveを2台使って操作する場合」について記事を書く予定です。



 

↑このページのトップヘ