KTの部屋
逆転ジョーカー(ダブルジョーカー)
概要 : ジョーカー(ババ抜き)に、最期まで順位が分からない要素を加える。
残っているプレイヤーで順位が変化する要素を加えて、 あがったプレイヤーも最後までゲーム状況に関心を抱かせる。
----------------------------------------------------------------------------------------------------------------------------------
内容 : 二枚のジョーカーを揃えたプレイヤーが勝ち。
人数 : 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
}
}
}