TowerCreate.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class TowerCreate : MonoBehaviour {
  6. public GameObject _tower_cursor; //置き範囲のオブジェクト
  7. GameObject Tower_Cursor; //選択したタワーの置き範囲
  8. public Tower[] towerPrefabs; //クリエイターしたタワーのObject
  9. public LayerMask mouseMask; //レヤー
  10. public int prefabSelect;//選択タワー番号
  11. public float gridIncrement = 2.5f;//マウスが移動どのぐらい時modelを移動、一回2.5を移動する
  12. bool mouseOnScreen = false; //マウスがシーンになるか
  13. Vector3 mouseGridPosition; //マウスの座標
  14. bool Cancel = true; //キャンセル状態
  15. void Start () {
  16. //初期化マウスのブロック
  17. Tower_Cursor = Instantiate(_tower_cursor, Vector3.zero, Quaternion.identity) as GameObject;
  18. Tower_Cursor.SetActive(false);
  19. }
  20. // Update is called once per frame
  21. void Update() {
  22. mouseOnScreen = Input.mousePresent;
  23. bool mouseOnUI = EventSystem.current.IsPointerOverGameObject();//マウスの位置がUIにあるのか
  24. if (!mouseOnUI)
  25. {
  26. if (mouseOnScreen)
  27. {
  28. RaycastHit hitInfo;
  29. //カメラからマウスに通じて射線が地面に当たるか
  30. bool mouseIsOverSomething = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo, 100, mouseMask);
  31. mouseGridPosition = hitInfo.point; //マウスの位置を取得
  32. mouseGridPosition.x =
  33. Mathf.Round(mouseGridPosition.x / gridIncrement) * gridIncrement; //マウスのx座標を修正
  34. mouseGridPosition.y =
  35. Mathf.Round(mouseGridPosition.y / 5) * 5+2.5f; //マウスのy座標を修正
  36. mouseGridPosition.z =
  37. Mathf.Round(mouseGridPosition.z / gridIncrement) * gridIncrement; //マウスのz座標を修正
  38. if (Input.GetMouseButtonDown(1) && !Cancel) { SelectCancel(); } //マウスを右クリックするとキャンセル
  39. }
  40. // cursorObject.SetActive(mouseOnScreen);
  41. if (Tower_Cursor != null)
  42. {
  43. //マウスmodel座標をマウス座標にする
  44. Tower_Cursor.transform.position = mouseGridPosition;
  45. Color cursorColor = new Color(0.58f, 0.15f, 0.15f, 0.2f); //今modelの色
  46. bool isBuildableGround = false; //当たる範囲がタワー作るか状態
  47. foreach (var col in Physics.OverlapBox(Tower_Cursor.transform.position, Tower_Cursor.transform.localScale/2))
  48. {
  49. //もし当たる範囲Wall,敵の道,他のタワーがあれば、タワーを作らない
  50. if (col.tag == "Wall" || col.tag =="Enemy_Floor" || col.tag=="Tower")
  51. {
  52. cursorColor = new Color(0.58f, 0.15f, 0.15f, 0.2f);
  53. Tower_Cursor.GetComponent<Renderer>().material.SetColor("_TintColor", cursorColor);
  54. Tower_Cursor.transform.Find("bottom").GetComponentInChildren<Renderer>().material.SetColor("_TintColor", cursorColor);
  55. // Debug.Log(col.tag);
  56. return;
  57. }
  58. else if (col.tag == "CreateFloor")
  59. {
  60. //タワーを作れるところになったら
  61. cursorColor = new Color(0.2f, 0.58f, 0.18f, 0.2f);
  62. isBuildableGround = true;
  63. }
  64. //マウスブロックの色を変わる
  65. Tower_Cursor.GetComponent<Renderer>().material.SetColor("_TintColor", cursorColor);
  66. //マウスブロック下の部分のmodel色を変わる
  67. Tower_Cursor.transform.Find("bottom").GetComponentInChildren<Renderer>().material.SetColor("_TintColor", cursorColor);
  68. }
  69. if (Input.GetMouseButtonDown(0) && isBuildableGround)
  70. {
  71. //タワーを作る
  72. PlaceTower(towerPrefabs[prefabSelect]);
  73. }
  74. }
  75. }
  76. }
  77. /// <summary>
  78. /// タワー作るメソッド
  79. /// </summary>
  80. /// <param name="tower">選択したタワー</param>
  81. void PlaceTower(Tower tower)
  82. {
  83. if (!Tower_Cursor.activeInHierarchy) return;
  84. //もしお金が足りるなら
  85. if (Nexus.CurrentInstance.UseMana(tower.upgradeCosts[0]))
  86. {
  87. //マウスブロックにあるタワーを削除
  88. Destroy(Tower_Cursor.GetComponentInChildren<Tower>().gameObject);
  89. Tower_Cursor.SetActive(false);//マウスブロックをオフにする
  90. //マウスブロックの位置にタワーを生成する
  91. Instantiate(tower, Tower_Cursor.transform.position - new Vector3(0, 2.5f, 0), Quaternion.identity);
  92. Cancel = true;//キャンセル状態
  93. }
  94. }
  95. /// <summary>
  96. /// タワーを選択するメソッド
  97. /// </summary>
  98. /// <param name="index">タワー番号</param>
  99. public void SelectPrefab(int index)
  100. {
  101. while (index < 0) index += towerPrefabs.Length; //選択した番号が間違い時
  102. while (index >= towerPrefabs.Length) index -= towerPrefabs.Length;//選択した番号が間違い時
  103. //今のお金足りるかをチェック
  104. if (!(Nexus.CurrentInstance.CurrentMana >= towerPrefabs[index].upgradeCosts[0])) { return; }
  105. prefabSelect = index;
  106. //タワーを生成
  107. Tower tower_mode = Instantiate(towerPrefabs[prefabSelect], Tower_Cursor.transform.position-new Vector3(0,2.5f,0), Quaternion.identity) as Tower;
  108. //選択したmodelの当たり判定Colliderをオフする
  109. tower_mode.GetComponentInChildren<Collider>().enabled = false;
  110. //選択したmodelのshader描画方法を変わる
  111. tower_mode.GetComponentInChildren<Renderer>().material.shader = Shader.Find("Particles/Additive");
  112. //選択したタワーのScriptをオフにする
  113. tower_mode.GetComponent<Tower>().enabled = false;
  114. //選択したタワーをマウスブロックの子供になる
  115. tower_mode.transform.SetParent(Tower_Cursor.transform);
  116. Tower_Cursor.SetActive(true);//マウスブロックをオンにする
  117. Cancel = false;//キャンセル状態
  118. }
  119. /// <summary>
  120. /// 選択キャンセル
  121. /// </summary>
  122. void SelectCancel()
  123. {
  124. Destroy(Tower_Cursor.GetComponentInChildren<Tower>().gameObject);
  125. Tower_Cursor.SetActive(false);
  126. Cancel = true;
  127. }
  128. }