top of page

逆転ジョーカー(ダブルジョーカー)

 

概要 :     ジョーカー(ババ抜き)に、最期まで順位が分からない要素を加える。

       残っているプレイヤーで順位が変化する要素を加えて、 あがったプレイヤーも最後までゲーム状況に関心を抱かせる。

----------------------------------------------------------------------------------------------------------------------------------

内容 :  二枚のジョーカーを揃えたプレイヤーが勝ち。

人数 :  4人以上

道具 :  トランプ(数字の52枚とジョーカー2枚の合計54枚)

----------------------------------------------------------------------------------------------------------------------------------

準備:

      ①全数字のトランプの束にジョーカーを一枚入れシャッフルする。

      ②参加人数にトランプを均等な枚数配る。

      ③手札に同じ数字が二枚以上揃っている場合、内二枚を捨て札として捨てる。

      ④この時に捨てたトランプの枚数が最も多いプレイヤーにジョーカーを一枚渡す。

       ※上位が同じ枚数の場合はジャンケンで決定する。

       ※この時点で1人のプレイヤーがジョーカーを二枚揃えると流局となり①から再開します。

プレイ:

      ⑤ジョーカーを渡したプレイヤーの番から開始。

      ⑥番になると、手札に同じ数字のトランプがある場合、内二枚を捨てることができる。

       手札を捨てた場合、捨てたトランプの数字の数だけ時計回りに数え、同じ数字になるプレイヤーの手札を二枚引く。

       捨てない場合、時計回りに隣接するプレイヤーの手札を一枚引く。

      ⑦トランプを引かれたプレイヤーが、次の番になります。

      ※⑥⑦を繰り返します。

 

勝敗:

      ・手札が0枚になったプレイヤーの順で、暫定順位を決定します。

      ・手札にジョーカーが二枚揃ったプレイヤーは一位確定であがりとなりゲーム終了。

       その時点であがっていた他のプレイヤーの順位を逆にして順位が確定します。

       (暫定順位 2位:Aさん 3位:Bさん → 確定順位 2位:Bさん 3位:Aさん)

       上がっていないプレイヤーは全員最下位となります。

      ・最後の2人の時に、手札がジョーカーのみとなったプレイヤーが最下位となりゲーム終了。

 

----------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

----------------------------------------------------------------------------------------------------------------------------------

 

以下は、逆転ジョーカーを考案中の際の資料です。

 

検討段階のルール

 

スタート

      ①全数字のトランプの束にジョーカーを一枚入れシャッフルする。

      ②参加人数にトランプを均等な枚数配る。

      ③手札に同じ数字が二枚以上揃うと、内二枚を捨て札として捨てる。

      ④この時に捨てたトランプの枚数が最も多いプレイヤーにジョーカーを一枚渡す。

       ※上位が同じ枚数の場合はジャンケンで決定する。

 

プレイ

      ⑤ジョーカーを渡したプレイヤーが時計回りで隣接するプレイヤーのトランプを一枚引く。

      ⑥手札に同じ数字が二枚揃うと、その二枚を捨て札に捨てる。

      ⑦トランプを引かれたプレイヤーが、時計回りで隣接するプレイヤーのトランプを一枚引く。

      ⑧これを繰り返します。

 

勝敗

      ・手札が0枚になったプレイヤーの順で、暫定順位を決定します。

      ・手札にジョーカーが二枚揃ったプレイヤーは一位確定であがりとなりゲーム終了。

       その時点であがっていた他のプレイヤーの順位を逆にして順位が確定します。

       (暫定順位 2位:Aさん 3位:Bさん → 確定順位 2位:Bさん 3位:Aさん)

       上がっていないプレイヤーは全員最下位となります。

      ・最後の2人の時に、手札がジョーカーのみとなったプレイヤーが最下位となりゲーム終了。

 

捕捉

      ・スタートの④の時点で1人のプレイヤーがジョーカーを二枚揃えると流局となり再スタートします。

 

ゲーム性

      ジョーカー(ババ抜き)は早くあがる事を目的とし、最下位を決定するゲーム性に対して、

      逆転ジョーカーは、二枚のジョーカーを揃える事を目的とし、一位を決定するゲーム性です。

      ジョーカー(ババ抜き)の真逆のゲーム性で検討してみました。

 

      残ったプレイヤーはジョーカーを揃えて1位を目指し、

      ジョーカーを揃えられずに早くあがったプレイヤーは、ジョーカーが揃わない事を祈り、

      逆に遅くあがったプレイヤーは、ジョーカーを二枚揃えて欲しいと祈る。

       ジョーカーが揃うか、最期の2人の内どちらかの手札がジョーカーのみになるまで順位がわからない。

 

----------------------------------------------------------------------------------------------------------------------------------

ゲームのデメリットをメリットに転換する必要がある。

 

      デメリット:ジョーカー以外のトランプが揃う事がデメリットになるため、不正行為が発生。リアルのトランプでは遊べないゲームとなる。

      メリットへ転換:手札が揃った場合に捨てるかどうかは任意にする。捨てる事でメリットを持たせる。

               →手札が揃い捨て札にすると、捨てた数字の数だけ時計回りに数えて同じ数字になるプレイヤーの手札を二枚引ける。

                 ※自分の番は飛ばしてカウントする。

               自分の手札の数は変わらずに対戦相手の手札を減らせ、更に引くチャンスが増えジョーカーを揃えやすくなるルールの追加。

               狙ってプレイヤーを上がらせトランプを引く順番に変化を加える戦略の増加。

 

----------------------------------------------------------------------------------------------------------------------------------

 

調整ルール

 

スタート

      ①全数字のトランプの束にジョーカーを一枚入れシャッフルする。

      ②参加人数にトランプを均等な枚数配る。

      ③手札に同じ数字が二枚以上揃うと、内二枚を捨て札として捨てる。

      ④この時に捨てたトランプの枚数が最も多いプレイヤーにジョーカーを一枚渡す。

 

プレイ

      ⑤ジョーカーを渡したプレイヤーの番から開始。

      ⑥番になると、手札に同じ数字のトランプがある場合、内二枚を捨てることができる。

       手札を捨てた場合、捨てたトランプの数字の数だけ時計回りに数え、同じ数字になるプレイヤーの手札を二枚引く。

       捨てない場合、時計回りに隣接するプレイヤーの手札を一枚引く。

      ⑦トランプを引かれたプレイヤーが、次の番になります。

      ※⑥⑦を繰り返します。

 

勝敗

      ・手札が0枚になったプレイヤーの順で、暫定順位を決定します。

      ・手札にジョーカーが二枚揃ったプレイヤーは一位確定であがりとなりゲーム終了。

       その時点であがっていた他のプレイヤーの順位を逆にして順位が確定します。

       (暫定順位 2位:Aさん 3位:Bさん → 確定順位 2位:Bさん 3位:Aさん)

       上がっていないプレイヤーは全員最下位となります。

      ・最後の2人の時に、手札がジョーカーのみとなったプレイヤーが最下位となりゲーム終了。

 

捕捉

      ・スタートの④の時点で1人のプレイヤーがジョーカーを二枚揃えると流局となり再スタートします。

      ・捨て札として捨てられるのは自分の番の時のみです。次のプレイヤーがカードを引くと捨てることはできません。

 

狙い

      ・カードを揃えて捨て札にすることでのメリットを持たせて、確実にプレイヤーの手札を場から減らす。

      ・捨てるタイミングは任意のため、不正行為に繋がらない。

 


//ModelView_Cameraの奴

using UnityEngine;
using System.Collections;

public class ModelView_Camera : MonoBehaviour 
{
    Transform target;
    float distance = 5.0f;
    
    float xSpeed = 250.0f;
    float ySpeed = 120.0f;
    
    float yMinLimit = -20;
    float yMaxLimit = 80;

    float zMin = 1;    //マウスホイールで近づける最小距離
    float zMax = 15;    //マウスホイールで離れられる最大距離
    float x = 0.0f;
    float y = 0.0f;
    float backDist = 0.0f;
    Vector3 angles;
    int Mouse_ON;
    
    void Start(){
        angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
        
        if(GetComponent<Rigidbody>()){
            GetComponent<Rigidbody>().freezeRotation = true;
        }
        
        target = GameObject.Find ("LookAt").transform;
        
    }
    void Update(){
        Mouse ();
    }
    
    void Mouse(){
        
        if (Input.GetMouseButtonDown(0)) {//マウスの左ボタンが押されたとき
            Mouse_ON = 1;
        }
        if (Input.GetMouseButtonUp(0)) {//マウスの左ボタンが押されたとき
            Mouse_ON = 0;
        }
        if (Input.GetMouseButtonDown(1)) {//マウスの左ボタンが押されたとき
            Mouse_ON = 2;
        }
        if (Input.GetMouseButtonUp(1)) {//マウスの左ボタンが押されたとき
            Mouse_ON = 0;
        }        
        
        if (Mouse_ON == 1) 
        {
            if (target) 
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                y = ClampAngle(y, yMinLimit, yMaxLimit);
            }
        }
        
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
        transform.rotation = rotation;
        transform.position = position;
        


        //スマホのピンチ操作によるズーム処理------------------------------------------------------
        if (Input.touchCount == 2) 
        {
            Touch t1 = Input.GetTouch(0);
            Touch t2 = Input.GetTouch(1);

            if(t2.phase == TouchPhase.Began)
            {
                backDist = Vector2.Distance (t1.position,t2.position);
            }
            else if(t1.phase == TouchPhase.Moved && t2.phase == TouchPhase.Moved)
            {
                // タッチ位置の移動後、長さを再測し、前回の距離からの相対値を取る。
                float newDist = Vector2.Distance (t1.position, t2.position);
                distance = distance + (backDist - newDist) / 100.0f;
            }

        }
        //-------------------------------------------------------------------------------------

        //ズームの距離に制限を設ける
        distance -= Input.GetAxis("Mouse ScrollWheel");
        distance = Mathf.Clamp(distance,zMin,zMax);
        
        //カメラの後方にレイを飛ばし近くのオブジェクトに当たったら
        //当たった位置にカメラを移動する
        RaycastHit hit;
        if (Physics.Raycast(target.transform.position,-transform.forward, out hit,distance)){
            transform.position = hit.point;
        }
    }
    
    float ClampAngle (float angle,float min,float max) {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp (angle, min, max);
    }

 

}

 

//ModelView_Characterのやつ
using UnityEngine;
using System.Collections;
using System.Collections.Generic;//List使うため追加
using System.IO;//キャプチャーを行うために追加
using UnityEngine.SceneManagement; //シーン切り替え用
using UnityStandardAssets.ImageEffects;

public class ModelView_Character : MonoBehaviour 
{
    //Start()でProjectNameを変えれば各データのパスを直ぐに変えれるようにするための変数
    string ProjectName;

    //処理を行うキャラクターデータ
    GameObject character;

    //複数表示時のキャラクターデータ
    GameObject character_L;
    GameObject character_R;
    int model_count;
    int BG_count;
    int Effect_count;
    int list_count;
    int Materials_count;

    GameObject BG_Map;
    Quaternion BG_rotate;
    float rotate_speed;

    GameObject Effect;

    GameObject Camera;

    //マテリアル取得用
    SkinnedMeshRenderer rend;

    //ファイル名を仮で格納
    List<Object> ModelList = new List<Object>(); //モデル名をリストで入れる
    List<Object> BG_Map_List = new List<Object>(); //モデル名をリストで入れる
    List<AnimationClip> AnimClipList = new List<AnimationClip>(); //アニメーション名をリストで入れる
    List<Material>MaterialsList = new List<Material>();
    string ModelPath,AnimPath,BGPath,MaterialPath; //リソースパスを入れる

    List<Object> Effect_List = new List<Object>(); //モデル名をリストで入れる
    string EffectPath; //リソースパスを入れる
    
    //アニメーションデータ格納用変数
    Animation _anim;
    Material _materials;
    int Animation_Number , Model_Number , BG_Number , Effect_Number;//使用するデータの管理番号
    int GetModel_Number , GetMotion_Number , GetBG_Number , GetEffect_Number;//取得したリソース数
    int AnimLoop_flag;
    int Materials_Number , GetMaterials_Number;
    //ボタン用フラグ
    int button_Model_flag;
    int button_Motion_flag;
    int button_BG_flag;
    int button_Rec_flag;
    int button_Pop_flag;
    int button_effect_flag;
    int button_armor_flag;
    int button_Eff_flag;
    int button_rotate_flag;
    int button_materials_flag;

    int list_max;

    //処理負荷確認
    int frameCount;
    float prevTime;
    float fps;

    //録画
    public RenderTexture RenderTextureRef;
    int button_Option_flag;
    int rec_flag;
    int rec_count;

    //複数キャラクター表示機能
    Animation _anim_L,_anim_R;
    string AnimPath_L,AnimPath_R;
    Vector3 pos_L,pos_R;

    int list_empty; //端数変数


    //初期化***************************************************************************************************************
    void Start () 
    {
        //プロジェクト毎にUnityで用意したプロジェクトフォルダの名前を指定---------------------------
        ProjectName = "Drachma";
        //各ボタンの情報管理-----------------------------------------------------------------------
        button_Model_flag = 0;
        button_Motion_flag = 0;
        button_effect_flag = 0;
        button_rotate_flag = 0;
        Animation_Number = 0;
        Model_Number = 0;
        GetModel_Number = 0;
        GetMotion_Number = 0;
        GetBG_Number = 0;
        AnimLoop_flag = 0;
        button_Eff_flag = 0;
        button_materials_flag = 0;
        Materials_count = 0;

        list_count = 0;
        list_max = 20;    //一度に表示するモデルリスト数

        BG_rotate.y = 180;
        rotate_speed = 0;

        //モデル情報取得--------------------------------------------------------------------------
        int i;
        ModelPath = ProjectName + "/Prefabs/Character/Model";
        foreach (Object obj in Resources.LoadAll(ModelPath,typeof (GameObject)))
        {
            GetModel_Number ++;
            ModelList.Add(obj);

        }
        //10体分づつ格納する
        list_empty = list_max - (GetModel_Number % list_max);    //余りを求める
        for ( i = 0 ; list_empty > i ; i++) {
            ModelList.Add (ModelList[0]);
        }
        //マテリアルデータを参照する
        MaterialPath = ProjectName + "/Graphics/Character/" + ModelList [Model_Number].name;

        //起動時のキャラクターを呼び出す-----------------------------------------------------------
        CharacterChange ();    

        //モデル情報取得--------------------------------------------------------------------------
        BGPath = ProjectName + "/Prefabs/Map";
        foreach (Object BGobj in Resources.LoadAll(BGPath,typeof (GameObject)))
        {
            GetBG_Number ++;
            BG_Map_List.Add(BGobj);
        }
        BGChange ();

        //エフェクト情報取得--------------------------------------------------------------------------
        EffectPath = ProjectName + "/Prefabs/Effect";
        foreach (Object Effectobj in Resources.LoadAll(EffectPath,typeof (GameObject)))
        {
            GetEffect_Number ++;
            Effect_List.Add(Effectobj);
        }

        Camera = GameObject.Find ("Main Camera");                //ゲームオブジェクトに登録

        //処理負荷確認---------------------------------------------------------------------------
        frameCount = 0;
        prevTime = 0.0f;

    }
    
    //ループ処理************************************************************************************************************    
    void Update () 
    {    
        if (Input.GetKeyUp (KeyCode.S)) {
            Application.CaptureScreenshot(Application.dataPath + "/ScreenShot_" + rec_count++ + ".png");
        
        }
        CharacterRotate ();

    }

    //操作ボタン処理********************************************************************************************************    
    void OnGUI () 
    {
        float Button_X = Screen.width / 4;
        float Button_Y = Screen.height / 32;
        
        //表示物情報を表示********************************************************
        uint totalUsed = UnityEngine.Profiling.Profiler.GetTotalAllocatedMemory (); // == Profiler.usedHeapSize
        uint totalSize = UnityEngine.Profiling.Profiler.GetTotalReservedMemory ();
        //string text = string.Format("ReservedMemory:{0}/{1} kb({2:f1}%)", totalUsed/1024, totalSize/1024, 100.0*totalUsed/totalSize);

        ++frameCount;
        float time = Time.realtimeSinceStartup - prevTime;
        if (time >= 1.0f) {
            fps = frameCount / time;
            frameCount = 0;
            prevTime = Time.realtimeSinceStartup;
        }
        GUI.TextField(new Rect(Button_X * 1, Button_Y * 0, Button_X * 2, Button_Y * 1), 
                      "fps\t= " + fps + " /sec"+"\n" +             //フレームレート表示
                      "[Sキー] でScreenShot撮影");
                      //"Memory\t= " + text);

        //メニューボタン**************************************************************
        //メニューモデルボタン*********************************************************
        if (button_Model_flag == 0) 
        {
            //if ( GUI.Button (new Rect (0, 0, 150, 30), "Model")) 
            if ( GUI.Button (new Rect (Button_X * 0, Button_Y * 0, Button_X, Button_Y), "Model")) 
            {    
                button_Model_flag = 1;    
                button_Motion_flag = 0;    
                button_BG_flag = 0;    
                button_Eff_flag = 0;
            }         
        }else {
            if ( GUI.Button (new Rect (Button_X * 0, Button_Y * 0, Button_X, Button_Y), "Close")) 
            {    
                button_Model_flag = 0;    
            }     
        }

        //メニューモーションボタン*****************************************************
        if (button_Model_flag == 0) {
            if (button_Motion_flag == 0) {
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * 1, Button_X, Button_Y), "Motion")) {    
                    button_Motion_flag = 1;    
                    button_Model_flag = 0;
                    button_BG_flag = 0;    
                    button_Eff_flag = 0;
                }         
            } else if (button_Motion_flag == 1) {
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * 1, Button_X, Button_Y), "Close")) {    
                    button_Motion_flag = 0;    
                }     
            }
        }
        //メニューBGボタン*****************************************************
        if(button_Model_flag == 0 && button_Motion_flag == 0)
        {
            if (button_BG_flag == 0) 
            {
                if ( GUI.Button (new Rect (Button_X * 0, Button_Y * 2, Button_X, Button_Y), "BG Map")) 
                {    
                    button_Motion_flag = 0;    
                    button_Model_flag = 0;
                    button_BG_flag = 1;
                    button_Eff_flag = 0;
                }
            }else if (button_BG_flag == 1) {
                if ( GUI.Button (new Rect (Button_X * 0, Button_Y * 2, Button_X, Button_Y), "Close")) 
                {    
                    button_BG_flag = 0;    
                }
            }
        }
        //メニューEffectボタン*****************************************************
        if (button_Model_flag == 0 && button_Motion_flag == 0) {
            if (button_BG_flag == 0) {
                if (button_Eff_flag == 0) {
                    if (GUI.Button (new Rect (Button_X * 0, Button_Y * 3, Button_X, Button_Y), "Effect")) {    
                        button_Motion_flag = 0;    
                        button_Model_flag = 0;
                        button_BG_flag = 0;
                        button_Eff_flag = 1;
                    }
                } else if (button_Eff_flag == 1) {
                    if (GUI.Button (new Rect (Button_X * 0, Button_Y * 3, Button_X, Button_Y), "Close")) {    
                        button_Eff_flag = 0;    
                        GameObject.DestroyImmediate(Effect); //既存のモデルを先に削除
                    }
                }
            }
        }

        //複数キャラ表示************************************************************
        if (button_Pop_flag == 0) 
        {
            if ( GUI.Button (new Rect (Button_X * 3, Button_Y * 1, Button_X, Button_Y), "複数<ON>")) 
            {    
                button_Pop_flag = 1;
                CharacterPop();
            }         
        }else {
            if ( GUI.Button (new Rect (Button_X * 3, Button_Y * 1, Button_X, Button_Y), "複数<OFF>")) 
            {    
                button_Pop_flag = 0;
                CharacterPop();
            }     
        }

        //モデル回転************************************************************
        if (button_rotate_flag == 0) 
        {
            if ( GUI.Button (new Rect (Button_X * 3, Button_Y * 4, Button_X, Button_Y), "モデル回転<ON>")) 
            {    
                button_rotate_flag = 1;
                //CharacterRotate ();
            }         
        }else {
            if ( GUI.Button (new Rect (Button_X * 3, Button_Y * 4, Button_X, Button_Y), "モデル回転<OFF>")) 
            {    
                button_rotate_flag = 0;
                //CharacterRotate ();
            } 

        }

        //マテリアル切り替え************************************************************MaterialsList [button_materials_flag].name
        if (button_materials_flag == 0) 
        {
            if ( GUI.Button (new Rect (Button_X * 3, Button_Y * 5, Button_X, Button_Y),  "マテリアルA")) 
            {    
                button_materials_flag = 1;
                Materials_Number = button_materials_flag;
                Materialschange();
            }         
        }else {
            if ( GUI.Button (new Rect (Button_X * 3, Button_Y * 5, Button_X, Button_Y), "マテリアルB")) 
            {    
                button_materials_flag = 0;
                Materials_Number = button_materials_flag;
                Materialschange ();
            } 

        }


        //リストボタン***************************************************************
        //モデル********************************************************************
        if (button_Model_flag == 1) 
        {//モデルメニューを開いている時に各キャラクターボタンを表示


            //ボタンに応じたキャラモデルに変更する命令
            for (model_count = 1 * list_count * list_max; model_count < list_max * (list_count + 1); model_count++) {

                if (GUI.Button (new Rect (Button_X * 0, Button_Y * (model_count + 2 - (list_max * list_count)), Button_X, Button_Y), ModelList [model_count].name)) {
                    Model_Number = model_count;    
                    CharacterChange ();    
                }
            }

            //10体毎のリスト切り替えボタン処理
            if (GUI.Button (new Rect (Button_X * 0.5f, Button_Y * 1, Button_X * 0.5f, Button_Y), "Next")) 
            {
                //モデル数のページ以上は処理しない
                int a = (GetModel_Number + list_empty) / list_max;

                if (list_count + 1 < a) {
                    list_count += 1;
                }

            }
            if (GUI.Button (new Rect (Button_X * 0, Button_Y * 1, Button_X * 0.5f, Button_Y), "Back")) {
                //0の時は処理しない
                if (list_count > 0) 
                {
                    list_count -= 1;
                }

            }


        }

        //モーション*****************************************************************
        if (button_Motion_flag == 1) 
        {//モーションのループ指定ボタン
            if(AnimLoop_flag == 0){
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * 2, Button_X, Button_Y), "ループ再生<ON>")) 
                {
                    AnimLoop_flag = 1;
                }
            }else{
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * 2, Button_X, Button_Y), "ループ再生<OFF>")) 
                {
                    AnimLoop_flag = 0;
                }
            }
            for (int anim_count = 0; anim_count < GetMotion_Number; anim_count++) 
            {//モーションの数だけボタンを用意
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * (anim_count + 3), Button_X, Button_Y), AnimClipList[anim_count].name)) 
                {
                    Animation_Number = anim_count;    //押されたボタンに応じてアニメーションの番号を指定
                    CharacterMotion();
                }
            }
        }
        //BGモデル********************************************************************
        if (button_BG_flag == 1) 
        {//モデルメニューを開いている時に各キャラクターボタンを表示
            for (BG_count=0; BG_count<GetBG_Number; BG_count++) 
            {//ボタンに応じたキャラモデルに変更する命令
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * (BG_count + 3), Button_X, Button_Y), BG_Map_List[BG_count].name)) 
                {
                    BG_Number = BG_count;    
                    BGChange();    
                }
            }
            BG_Map.transform.rotation = BG_rotate;
        }

        //エフェクトモデル********************************************************************
        if (button_Eff_flag == 1) 
        {//モデルメニューを開いている時に各キャラクターボタンを表示
            for (Effect_count=0; Effect_count<GetEffect_Number; Effect_count++) 
            {//ボタンに応じたキャラモデルに変更する命令
                if (GUI.Button (new Rect (Button_X * 0, Button_Y * (Effect_count + 4), Button_X, Button_Y), Effect_List[Effect_count].name)) 
                {
                    Effect_Number = Effect_count;
                    EffectPlay ();    
                }
            }
        }

 


        //シーン切り替え********************************************************************************************************    
        if (GUI.Button (new Rect (Button_X * 3, Button_Y * 0, Button_X, Button_Y), "Viewer Change")) 
        {
            //SceneManager.LoadScene ("Scene/Straw_MapView");
        }
        //特殊効果オンオフ********************************************************************************************************
        if (button_effect_flag == 0) 
        {
            if (GUI.Button (new Rect (Button_X * 3, Button_Y * 2, Button_X, Button_Y), "特殊効果<ON>")) 
            {
                Camera.GetComponent<Bloom> ().enabled = true;
                button_effect_flag = 1;
            }

        }else{
            if (GUI.Button (new Rect (Button_X * 3, Button_Y * 2, Button_X, Button_Y), "特殊効果<OFF>")) 
            {
                Camera.GetComponent<Bloom> ().enabled = false;
                button_effect_flag = 0;
            }
        }

        //クロスブレイクオンオフ********************************************************************************************************
        if (button_armor_flag == 0) 
        {
            if (GUI.Button (new Rect (Button_X * 3, Button_Y * 3, Button_X, Button_Y), "ブレイク<ON>")) 
            {
                //シェーダーのパラメーターを変更するコード
                Material seiyaMaterial = character.GetComponentInChildren<SkinnedMeshRenderer> ().material;
                seiyaMaterial.SetFloat ("_BrokeAmount",0);
                button_armor_flag = 1;
            }

        }else{
            if (GUI.Button (new Rect (Button_X * 3, Button_Y * 3, Button_X, Button_Y), "ブレイク<OFF>")) 
            {
                //シェーダーのパラメーターを変更するコード
                Material seiyaMaterial = character.GetComponentInChildren<SkinnedMeshRenderer> ().material;
                seiyaMaterial.SetFloat ("_BrokeAmount",1);
                button_armor_flag = 0;
            }
        }

    }

    //キャラモデル切り替え処理********************************************************************************************************    
    void BGChange () 
    {
        GameObject.DestroyImmediate(BG_Map); //既存のモデルを先に削除
        //GetBG_Number = 0;
        //押されたボタンに応じてモデルを指定する
        if (BG_Number >= 0) {
            Instantiate (BG_Map_List [BG_Number]);//キャラリストで選択されたキャラクターをインスタンスとして生成
            BG_Map = GameObject.Find (BG_Map_List [BG_Number].name + "(Clone)");                //ゲームオブジェクトに登録
            BG_Map.name = BG_Map_List [BG_Number].name;//Cloneを消す
        }
    }

    //キャラモデル切り替え処理********************************************************************************************************    
    void CharacterChange () 
    {
        GameObject.DestroyImmediate(character); //既存のモデルを先に削除
        AnimClipList.Clear();//取得したアニメーション情報をクリアする
        MaterialsList.Clear();//取得したアニメーション情報をクリアする
        GetMotion_Number = 0;

        //押されたボタンに応じてモデルを指定する
        if (Model_Number >= 0) 
        {
            Instantiate (ModelList[Model_Number]);//キャラリストで選択されたキャラクターをインスタンスとして生成
            character = GameObject.Find (ModelList[Model_Number].name + "(Clone)");                //ゲームオブジェクトに登録
            //character.name = ModelList[Model_Number].name;//Cloneを消す
            character.name = "Character";//Cloneを消す

            //マテリアルデータを参照する
            MaterialPath = ProjectName + "/Graphics/Character/" + ModelList [Model_Number].name;
            //読み込んだモデルにマテリアルを動的に設定する


            //全キャラで共通モーションを参照する処理に変更
            AnimPath = ProjectName + "/Prefabs/Character/Motion/Common_motion";
            //読み込んだモデルにアニメーションなどを動的に設定する
            CharacterSeting ();    

            //キャラと同フォルダのモーションデータを参照する処理
            AnimPath = ProjectName + "/Prefabs/Character/Motion/" + ModelList[Model_Number].name;
            //読み込んだモデルにアニメーションなどを動的に設定する
            CharacterSeting ();    


        }

    }
    void CharacterSeting()
    {
        character.AddComponent<Animation> ();
        //character.AddComponent<Material> ();

        //リソースからモデルを読み込みアニメーションを追加する処理
        _anim = character.GetComponent<Animation> ();
        foreach (AnimationClip anim_clip in Resources.LoadAll(AnimPath,typeof (AnimationClip)))
        {
            AnimClipList.Add(anim_clip);
            _anim.AddClip(AnimClipList[GetMotion_Number],AnimClipList[GetMotion_Number].name);
            GetMotion_Number ++;
        }

 

        //リソースからモデルを読み込みマテリアルを追加する処理
        //_materials = character.GetComponent<SkinnedMeshRenderer>().material;
        foreach (Material material in Resources.LoadAll(MaterialPath,typeof (Material)))
        {

            MaterialsList.Add(material);
            //_materials.Add (MaterialsList [GetMaterials_Number], MaterialsList [GetMaterials_Number]);
            GetMaterials_Number ++;
        }

        Debug.Log (GetMaterials_Number);

        //再生準備
        Animation_Number = 0;    //再生しているアニメーションを初期の0(待機?)に戻しておく
        Materials_Number = 0;
    }
    //モーション再生処理********************************************************************************************************    
    void CharacterMotion()
    {
        //ループ再生の切り替え処理
        if (AnimLoop_flag == 1) {
            _anim [AnimClipList [Animation_Number].name].wrapMode = WrapMode.Loop;
        } else {
            _anim [AnimClipList [Animation_Number].name].wrapMode = WrapMode.Once;
        }
        
        //押されたボタンに応じてモーションを指定する
        if (Animation_Number >= 0) 
        {
            _anim.Play (AnimClipList[Animation_Number].name);
            Animation_Number = 0;
        }
    }

    //複数キャラクターのポップ機能
    void CharacterPop()
    {
        pos_L = transform.position;
        pos_L.x = 1.0f;
        pos_L.y = 0.0f;
        pos_L.z = 0.0f;

        pos_R = transform.position;
        pos_R.x = -1.0f;
        pos_R.y = 0.0f;
        pos_R.z = 0.0f;
        
        //複数表示機能オンの時
        if (button_Pop_flag == 1) 
        {
            int rand_L = Random.Range( 0 , GetModel_Number);
            int rand_R = Random.Range( 0 , GetModel_Number);

            character_L = GameObject.Find ("Character_L");//生成したプレハブの名前を書き換える
            Instantiate (ModelList [rand_L]);
            character_L = GameObject.Find (ModelList [rand_L].name + "(Clone)");                //ゲームオブジェクトに登録
            character_L.transform.position = pos_L;
            character_L.name = "Character_L";

            character_R = GameObject.Find ("Character_R");//生成したプレハブの名前を書き換える
            Instantiate (ModelList [rand_R]);
            character_R = GameObject.Find (ModelList [rand_R].name + "(Clone)");                //ゲームオブジェクトに登録
            character_R.transform.position = pos_R;
            character_R.name = "Character_R";

        }
        if (button_Pop_flag == 0) 
        {
            GameObject.DestroyImmediate(character_L); //既存のモデルを先に削除
            GameObject.DestroyImmediate(character_R); //既存のモデルを先に削除
        }

    }

    //キャラモデル回転昨日
    void CharacterRotate()
    {
        

        if (button_rotate_flag == 1) {
            rotate_speed += 0.2f;
            //Debug.Log (rotate.y);
        
        }
        if (button_rotate_flag == 0) {
            rotate_speed = 0;

        }
        //回転処理
        character.transform.eulerAngles = new Vector3(0,rotate_speed,0);
    }

 

    void EffectPlay(){
        GameObject.DestroyImmediate(Effect); //既存のモデルを先に削除
        //GetBG_Number = 0;
        //押されたボタンに応じてモデルを指定する
        if (Effect_Number >= 0) {
            Instantiate (Effect_List [Effect_Number]);//キャラリストで選択されたキャラクターをインスタンスとして生成
            Effect = GameObject.Find (Effect_List [Effect_Number].name + "(Clone)");                //ゲームオブジェクトに登録
            Effect.name = Effect_List [Effect_Number].name;//Cloneを消す
        }    
    
    }

 


    void Materialschange()
    {
        if (button_materials_flag == 1) {
            //マテリアル取得 gameObject.transform.Find("Mesh").GetComponent<SkinnedMeshRenderer>().material = hogehoge;
            character.transform.Find("Mesh").GetComponent<SkinnedMeshRenderer>().material = MaterialsList [button_materials_flag];
        }
        if (button_materials_flag == 0) {
            character.transform.Find("Mesh").GetComponent<SkinnedMeshRenderer>().material = MaterialsList [button_materials_flag];

        }

    }

}

 

Shader シェーダー名"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
           _ToonTex ("Toon Texture", 2D) = "white" {}
        _BaseColor ("Base Color", Color) = (0.5, 0.5, 0.5, 1)
        _LightColor ("Light Color", Color) = (1, 1, 1, 1)
        _SkyColor("Sky Color", Color) = (1, 1, 1, 1)
        _GroundColor("Ground Color", Color) = (1, 1, 1, 1)


        [Space(10)]
        [Header(Specular)]
        _SpecularColor("Gloss Color", Color) = (0.5,0.5,0.5,1)
        _Gloss ("Gloss", float ) = 0.6
        _ReflectValue ("Reflection", float ) = 0.6
    }

    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
            "Queue"="Geometry"
        }
        
        Pass
        {
            Cull Back
            ZTest LEqual
            ZWrite On
            Lighting Off
            AlphaTest Off
            Blend Off

            Stencil {
                Ref 2
                Comp always
                Pass Replace
            }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma target 2.0

            // Material parameters
            half3 _BaseColor;
            half3 _AddColor;
            half3 _LightColor;
            half3 _SkyColor;
            half3 _GroundColor;

            // Textures
            sampler2D _MainTex;
            sampler2D _ToonTex;
            half4 _MainTex_ST;
            half4 _ToonTex_ST;

            // Specular
            half _ReflectValue;
            half _Gloss;
            half3 _SpecularColor;

            // Vertex to fragment
            struct v2f
            {
                half4 pos    : SV_POSITION;
                half3 wnor  : TEXCOORD0;
                half2 uv      : TEXCOORD1;
                half2 uv2     : TEXCOORD2;

                half3 uv3 : TEXCOORD3;
                half3 uv4 : TEXCOORD4;
            };

            // Vertex shader
            v2f vert( appdata_base v )
            {
                v2f o;
                o.pos = UnityObjectToClipPos( v.vertex );
                o.uv = v.texcoord;

                o.wnor = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal));
                o.uv2 = TRANSFORM_TEX(o.wnor.xy, _ToonTex ) * 0.47 + half2(0.5, 0.5);

                o.uv4 = mul(unity_ObjectToWorld, v.vertex);
                o.uv3 = UnityObjectToWorldNormal(v.normal);

                return o;
            }

            half3 HemiSphereLight(half normal)
            {
                half    rate = normal * 0.5 + 0.5;
                half3 a = _GroundColor * (1 - rate);
                half3 b = _SkyColor * rate;
                half3    color = a + b;            
                return color;
            }

            half4 frag( v2f i ) : COLOR
            {
                //Specular
                half3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.uv4);
                half3 viewReflectDirection = reflect( -viewDirection, i.uv3);
                half3 specular = ((_ReflectValue * pow(max(0,dot(viewDirection, viewReflectDirection)), exp2((_Gloss * 10.0 + 1.0)))) * _SpecularColor.rgb);

                half3 diffSamplerColor = tex2D( _MainTex, i.uv);
                half3 combinedColor = 1 + ((tex2D(_ToonTex, i.uv2) * _LightColor) + HemiSphereLight(i.wnor.y));
                return half4( ((diffSamplerColor * combinedColor) * _BaseColor * 2 + _AddColor) + specular ,1) ;
            }
ENDCG
        }        
    }
}

 

  • facebook
  • Twitter Round
  • googleplus
  • flickr

© 2023 visKT Wix.comを使って作成されました

bottom of page