using System.Collections;
using System.Collections.Generic;
public class BattleMenu : MonoBehaviour {
public GameObject baseMenu; // デフォルトのメニュー
public GameObject buildManu; // トラップ建設のメニュー
public PlayerController playerController; // プレイヤーのscript
private Transform nowMenu; // 現在表示対象のメニューのTransform
private bool menuMoveFlg = false; // メニューが動いているかどうか
private float menuRadius = 200; // メニューの半径
private float menuNextRadius = 350; // 次のメニューが表示されるときに前のメニューが外に動くときの半径
private float moveSpeed = 2000; // 動くスピード
//OpenBaseMenu(baseMenu.transform);
// PlayerControllerから私の場合はマウスホイールクリックかpキークリックで呼ばれる
public void OpenBaseMenu()
StartCoroutine(OpenMenu (baseMenu.transform));
private IEnumerator OpenMenu(Transform menu)
menu.gameObject.SetActive(true);
List<Transform> menuList = new List<Transform>();
foreach(Transform tran in menu)
if(nowRadius != menuRadius)
nowRadius += moveSpeed * 0.01f;
if(nowRadius >= menuRadius)
SetMenuPos(menuList, nowRadius, new Vector4(1,1,1,(float)nowRadius/ (float)menuRadius));
yield return new WaitForSeconds(0.01f);
// 次のメニューが開くので外側にフェード合うとする処理
private IEnumerator NextMenu(Transform menu)
menu.gameObject.SetActive(true);
List<Transform> menuList = new List<Transform>();
foreach(Transform tran in menu)
float nowRadius = menuRadius;
if(nowRadius != menuNextRadius)
nowRadius += moveSpeed * 0.01f;
if(nowRadius >= menuNextRadius)
nowRadius = menuNextRadius;
SetMenuPos(menuList, nowRadius, new Vector4(1,1,1,1f - (float)nowRadius/ (float)menuNextRadius));
yield return new WaitForSeconds(0.01f);
menu.gameObject.SetActive(false);
// メニューを閉じるので内側にフェードアウトする処理
private IEnumerator CloseMenu(Transform menu, bool isEnd)
menu.gameObject.SetActive(true);
List<Transform> menuList = new List<Transform>();
foreach(Transform tran in menu)
float nowRadius = menuRadius;
nowRadius -= moveSpeed * 0.01f;
SetMenuPos(menuList, nowRadius, new Vector4(1,1,1, 1f- (float)(menuRadius - nowRadius)/ (float)menuRadius));
yield return new WaitForSeconds(0.01f);
menu.gameObject.SetActive(false);
playerController.MenuEnd();
private void SetMenuPos(List<Transform> menuList, float nowRadius, Vector4 menuColor)
Vector3 pos = Vector3.zero; // サブメニューの位置
for(int i = 0; i < menuList.Count; i++)
rot = 360 / menuList.Count * i + 90;
rad = rot * Mathf.Deg2Rad; // 角度からラジアンに変換
pos.x = Mathf.Cos(rad) * nowRadius;
pos.y = Mathf.Sin(rad) * nowRadius;
menuList[i].localPosition = pos;
menuList[i].FindChild("Sprite").GetComponent<UISprite>().color = menuColor;
// PlayerControllerからメニューを閉じるとき、またはメニューが確定されたときによばれる
StartCoroutine(CloseMenu(nowMenu, true));
public void ManuClick(GameObject obj)
// 建設メニューだけは子のメニューがあるので子のメニューを開く
StartCoroutine(NextMenu(baseMenu.transform));
StartCoroutine(OpenMenu(buildManu.transform));
// 他はメニューが確定されたときなので好きに処理を書く。
else if(obj.name.IndexOf("Build") != -1)
StartCoroutine(CloseMenu(nowMenu, false));
playerController.BuildPosition(CommonConst.PREFAB_BARRICADE + "1");
StartCoroutine(CloseMenu(nowMenu, true));