ヤマコーブログ

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

2014年05月

前回の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も併用してたのでこうなってます。読み替えてください。

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

↑このページのトップヘ