/// <summary> /// 回転の軸にするオブジェクトを返す処理(縦プラス方向) /// </summary> /// <param name="player_ver">プレイヤー:縦</param> /// <param name="player_side">プレイヤー:横</param> /// <param name="player_high">プレイヤー:高さ</param> /// <returns></returns> public GameObject Get_Center_Ver_Plus(int player_ver, int player_side, int player_high) { //子オブジェクトを配列に格納 Storage_Children(); //最大値初期化 int max = g_zero_Count; //子オブジェクトの個数分繰り返す for (int child_pointer = g_zero_Count; child_pointer < g_child_Array.Length; child_pointer++) { //ダイスの現在の指標取得 (g_dice_ver, g_dice_side, g_dice_high) = g_child_Array[child_pointer].GetComponent <Dice_Squares>().Get_Dice_Pointer(); int type = g_game_con_Script.Get_Obj_Type(g_dice_ver, g_dice_side, g_dice_high - 1); //ダイスの縦の指標が保持している最大値以上& //ダイスの横の指標がプレイヤーの横の指標と同じ& //ダイスの縦の指標がプレイヤーの縦の指標と同じ if (type != 0 && max <= g_dice_ver && g_dice_side == player_side && g_dice_high == player_high) { //最大値を更新 max = g_dice_ver; //軸のダイスを更新 g_con_Dice = g_child_Array[child_pointer]; } } //軸にするダイスを返す return(g_con_Dice); }
// Update is called once per frame void Update() { //プレイヤー初期位置取得 if (g_getdate == true) { //g_check_vsh = g_potision_script.Get_potision(g_check_v, g_check_s, g_check_h); g_type_obj = g_tyep_script.Get_Obj_Type(g_playercontroller.g_player_pointer_ver, g_playercontroller.g_player_pointer_side, g_playercontroller.g_player_pointer_high); g_getdate = false; Get_Player_Pointer(); } }
private void Goal() { (int p_ver, int p_side, int p_high) = g_player_Script.Get_Player_Pointer(); int type = g_game_con_Script.Get_Obj_Type(p_ver, p_side, p_high - 1); if (type == 20) { if (SceneManager.GetActiveScene().name == "MainScene") { g_trouble_num = g_trouble_Script.g_troublenum; Debug.Log(g_trouble_num); //評価するためのスクリプトを呼び出す g_result_Script.Trouble_Eva(g_trouble_num, g_max_trouble_num, g_max_trouble_num * 0.5f, g_max_trouble_num * 0.1f); g_clear_Script.This_Stage_Clear(); } else if (SceneManager.GetActiveScene().name == "TutrialScene") { if (g_one_flag == false) { g_information_Script.g_tutorial_num++; g_one_flag = true; } if (g_information_Script.g_tutorial_num == g_folder_Script.Filenum("T*.json")) { g_clear_Script.Move_Select(); } else { g_information_Script.Change_Tutorial("/Tutorial/TStage00" + g_information_Script.g_tutorial_num + ".json"); g_clear_Script.Move_Tutrial(); } } } }
/// <summary> /// ダイスをどれだけ落下させるか調べる処理 /// </summary> private void Fall_Check() { //最小値初期化 g_min_counter = g_min_Start; //ダイスの個数分だけ処理を繰り返す for (int dice_count = g_zero_Count; dice_count < g_work_dices.Length; dice_count++) { g_fall_counter = g_zero_Count; //ダイスのスクリプト取得 g_child_Script = g_work_dices[dice_count].GetComponent <Dice_Squares>(); //ダイスの現在位置取得 (g_dice_ver, g_dice_side, g_dice_high) = g_child_Script.Get_Dice_Pointer(); //落下先が埋まるか、配列の範囲外になるまで繰り返す for (int pointer = g_dice_high - 1; pointer >= g_zero_Count; pointer--) { //同じ親フラグ初期化 g_same_parent_flag = false; //検索先に埋まっているオブジェクトのタイプ取得 int type = g_game_Con_Script.Get_Obj_Type(g_dice_ver, g_dice_side, pointer); //検索先がダイスの時、ダイスが検索用ダイスと同じ階層にあるか調べる if (type >= 100) { //検索用ダイスの親オブジェクトを取得 GameObject dice_parent = g_work_dices[dice_count].transform.parent.gameObject; //検索先のダイス取得 GameObject next_dice = g_game_Con_Script.Get_Obj(g_dice_ver, g_dice_side, pointer); //検索先のダイスの親オブジェクトを取得 GameObject next_parent = next_dice.transform.parent.gameObject; //ダイスが検索用ダイスと同じ階層にあるか調べる if (dice_parent == next_parent) { //同じならフラグON g_same_parent_flag = true; } } //移動先オブジェクトが空白ではないなら(床があるなら) if (type != 0 && !g_same_parent_flag) { //処理終了 break; } //検索先の移動回数+1 g_fall_counter++; } //移動回数が最小値より小さいなら if (g_fall_counter < g_min_counter) { //最小値上書き g_min_counter = g_fall_counter; } } }
/// <summary> /// 回転できるかを調べる処理 /// </summary> /// <param name="ver">縦</param> /// <param name="side">横</param> /// <param name="high">高さ</param> /// <returns>True:回転できる/False:回転できない</returns> public bool Check(int ver, int side, int high) { //移動先が配列の範囲外の時 if (ver < g_zero_Count || g_max_Ver <= ver || side < g_zero_Count || g_max_Side <= side || high < g_zero_Count || g_max_High <= high) { //処理終了 //回転させない状態を返す return(false); } //検索位置に格納されているオブジェクトのタイプ取得 int type = g_game_Con_Script.Get_Obj_Type(ver, side, high); //移動先が埋まっていた時 if (type != 0) { //処理終了 //回転させない状態を返す return(false); } //回転できる状態を返す return(true); }
/// <summary> /// 指定した位置に格納されているオブジェクトのタイプを取得する /// </summary> /// <param name="this_ver">縦</param> /// <param name="this_side">横</param> /// <param name="this_high">高さ</param> private void Check_Type(int this_ver, int this_side, int this_high, int change_para) { //タイプ取得 int type = g_game_Con_Script.Get_Obj_Type(this_ver, this_side, this_high); //取得したタイプがサイコロだった時 if (type >= 100) { //接触された側のオブジェクトを取得 g_next_dice_Obj = g_game_Con_Script.Get_Obj(this_ver, this_side, this_high); //接触された側のスクリプトを取得 g_next_dice_Script = g_next_dice_Obj.GetComponent <Dice_Squares>(); //移動側の接触面のパラメータを保持 g_adhesive_para = change_para; //接触面を調べてくっつくか調べる Docking_Check(); } }
/// <summary> /// 指定したパラメータと位置に応じてプレイヤーを移動させる /// </summary> /// <param name="ver">縦</param> /// <param name="side">横</param> /// <param name="high">高さ</param> /// <param name="para">移動方向パラメータ</param> public void PlayerMove(int para) { if (g_play_con_Script.Get_MoveFlag()) { return; } //プレイヤーの現在のポインター取得 (g_player_ver, g_player_side, g_player_high) = g_play_con_Script.Get_Player_Pointer(); //移動前のプレイヤーの向きを取得(ジャンプ判定用) int before_direction = g_direction_Script.Get_Player_Direction(); //プレイヤーオブジェクトの向きをパラメータに応じて変更する g_direction_Script.Player_Direction_Change(para); //移動後のプレイヤーの向きを取得(ジャンプ判定用) int after_direction = g_direction_Script.Get_Player_Direction(); //移動する向きに応じて処理を変える switch (para) { //縦プラス方向 case g_ver_plus_Para: g_player_ver = g_player_ver + 1; break; //縦マイナス方向 case g_ver_minus_Para: g_player_ver = g_player_ver - 1; break; //横プラス方向 case g_side_plus_Para: g_player_side = g_player_side + 1; break; //横マイナス方向 case g_side_minus_Para: g_player_side = g_player_side - 1; break; } //移動が可能か調べる g_is_move = Move_Check(g_player_ver, g_player_side, g_player_high); //移動不可状態なら if (!g_is_move) { //移動処理中止 return; } //移動先に格納されているオブジェクトのタイプ int type = g_game_con_Script.Get_Obj_Type(g_player_ver, g_player_side, g_player_high); //取得したオブジェクトのタイプに応じて処理 //空白の時 //プレイヤーを移動させる if (type == 0) { //落下可能か調べる g_is_move = Fall_Check(g_player_ver, g_player_side, g_player_high); //落下不可能の時 if (!g_is_move) { //移動処理中止 return; } //移動先が今と同じ高さなら if (g_player_high - g_check_high == 0) { //移動アニメーション再生 g_anim_Script.Player_Move_Anim(); } //移動先が自分のいる場所より低い位置なら else if (g_player_high - g_check_high != 0) { //落下モーションを再生 g_anim_Script.Player_Jump_Anim(); } //移動先の高さの指標を変更する g_player_high = g_check_high; //移動先のポジション取得 Vector3 get_pos = g_game_con_Script.Get_Pos(g_player_ver, g_player_side, g_player_high); //取得した位置にプレイヤーを移動させる g_appearance_move_Script.Player_Move(get_pos); //プレイヤーの現在地を更新する g_play_con_Script.Storage_Player_Pointer(g_player_ver, g_player_side, g_player_high); } //移動先が移動前の向いている方向と同じなら //ジャンプするか調べる else if (before_direction == after_direction) { //ジャンプできるか調べる //条件を満たせばジャンプさせる Jump(); } }
/// <summary> /// 保持している情報をもとに一手前の状態に戻す /// </summary> public void Undo_Play() { if (!g_is_undo) { return; } if (g_player_con_Script.Get_MoveFlag()) { return; } g_is_undo = false; //プレイヤーの移動先取得 Vector3 _player_pos = g_game_con_Script.Get_Pos(g_player_ver, g_player_side, g_player_high); //プレイヤー移動 g_player_obj.transform.position = _player_pos; //プレイヤーの保持する指標変更 g_player_con_Script.Storage_Player_Pointer(g_player_ver, g_player_side, g_player_high); //プレイヤーの向きを変更 g_direction_Script.Player_Direction_Change(g_player_direction); //ダイス配列用の指標 int _dice_pointer = 0; //縦・横・高さ配列用の指標 int _point_pointer = 0; //保持している親の数分繰り返す for (int i = 0; i < g_undo_parents.Length; i++) { //親オブジェクト取得 GameObject _work_parent = g_undo_parents[i]; //親の子オブジェクトの数取得 int _work_count = g_undo_dice_counters[i]; //子オブジェクトの数分繰り返す for (int j = 0; j < _work_count; j++) { //子オブジェクト取得 GameObject _work_dice = g_undo_dices[j + _dice_pointer]; //子オブジェクトの親を今保持している親に変更 _work_dice.transform.parent = _work_parent.transform; //縦の指標取得 g_work_ver = g_dice_pointers[_point_pointer]; //横の指標取得 g_work_side = g_dice_pointers[_point_pointer + 1]; //高さの指標取得 g_work_high = g_dice_pointers[_point_pointer + 2]; //元に戻す位置を取得 Vector3 _undo_pos = g_game_con_Script.Get_Pos(g_work_ver, g_work_side, g_work_high); //子オブジェクトを移動 _work_dice.transform.position = _undo_pos; //ダイスのスクリプト取得 g_squares_Script = _work_dice.GetComponent <Dice_Squares>(); //ダイスの移動前の指標取得 (g_before_ver, g_before_side, g_before_high) = g_squares_Script.Get_Dice_Pointer(); //オブジェクトの種類を取得 int _type = g_game_con_Script.Get_Obj_Type(g_before_ver, g_before_side, g_before_high); //大元の配列からダイスを除去 g_game_con_Script.Storage_Reset(g_before_ver, g_before_side, g_before_high); //移動後の縦・横・高さの指標に変更 g_squares_Script.Storage_This_Index(g_work_ver, g_work_side, g_work_high); //大元の配列にダイス格納 g_game_con_Script.Storage_Obj(g_work_ver, g_work_side, g_work_high, _work_dice); //大元の配列に種類格納 g_game_con_Script.Storage_Obj_Type(g_work_ver, g_work_side, g_work_high, _type); //ダイスの移動後のマス目を取得 g_work_after_squares = g_squares_Script.Get_Dice_Squares(); //配列に保持しているマス目を取得する g_work_before_squares = Get_Dice_Squares(); //ダイスが保持しているマス目を保持していたマス目に変更する g_squares_Script.Storage_Squares(g_work_before_squares); //変更後のマス目に応じてダイスを回転させる g_dice_create_Script.Undo_Squares_Change(_work_dice, g_work_before_squares, g_work_after_squares); //縦・横・高さ配列の指標を3つ進める _point_pointer += 3; } //ダイス用の配列の指標を取り出した個数分進める _dice_pointer += _work_count; } //手数を戻す g_trouble_Script.Trouble_Plus(); //保持する変数を全て初期化 Array_Reset(); }