using System.Net.Mime; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; // ** public class Character : MonoBehaviour { //角色等级 int level = 1; //角色ID int id = 0; //角色阵营序列号 public int groupNumber; //角色可加点属性 int str = 1; int dex = 1; int san = 1; int inte = 1; int def = 1; int vig = 1; //角色衍生属性 int maxHealth; int maxPoise; int maxMovement ; int currentHealth; int currentMovement; int currentPoise; //调用其他类 WeaponManager weaponManager; CharacterUIManager characterUIManager; MovementBar movementBar; GameObject currentWeaponObject; Weapon currentWeapon; GameManager gameManager; Animator animator; Vector2 lookDirection = new Vector2(1, 0); // ** 初始化lookDirection //初始化 void Start() { animator = GetComponent(); gameManager = GameObject.Find("GameManager").GetComponent(); //初始化角色战斗属性 maxMovement = (int)(dex * 2 + san * 2 + 8); maxHealth = 10 + vig * 10; maxPoise = (int)(str * 4 + vig * 2); currentMovement = maxMovement; currentHealth = maxHealth; currentPoise = maxPoise; //初始化角色UI characterUIManager = transform.GetChild(1).GetComponent(); movementBar = transform.GetChild(1).GetChild(2).GetComponent(); characterUIManager.ChangePoints(0, 1.0f, 0); characterUIManager.ChangePoints(0, 1.0f, 1); movementBar.ChangeMovement(0, currentMovement, 1); //初始化角色位置 RaycastHit2D hit = Physics2D.Raycast(transform.position,Vector2.up,1.0f,LayerMask.GetMask("Cells")); hit.collider.GetComponent().SetOccupied(true); hit.collider.GetComponent().SetCurrentCharacter(this); //初始化角色武器 weaponManager = transform.GetChild(0).GetComponent(); } //鼠标点击角色 private void OnMouseDown() { if(gameManager.GetSelected() != null) gameManager.GetSelected().Cancel(); if(currentMovement >= 0) Selected(); } //选中角色 public void Selected() { if(gameManager.currentGroup != groupNumber || currentMovement < 1) return; animator.SetFloat("selected", 1); gameManager.SetSelected(gameObject.GetComponent()); if(!gameManager.GetExploreMode()) { weaponManager.SetCurrnetWeaponActive(true); movementBar.SetMovementActive(true); } } //取消选中角色 public void Cancel() { animator.SetFloat("selected", 0); gameManager.SetSelected(null); weaponManager.SetCurrnetWeaponActive(false); if(!gameManager.GetExploreMode()) movementBar.SetMovementActive(false); } //移动角色 public void Move(Vector2 deviation) { //角色朝向 Turn(deviation); //判断角色是否能够前进 Vector2 temp = new Vector2(deviation.x + transform.position.x, deviation.y + transform.position.y); RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position,deviation,1.0f,LayerMask.GetMask("Cells")); if(hits.Length <= 1) { Debug.Log("Not Accessed"); } else { Cell currentCell = hits[0].collider.GetComponent(); Cell cell = hits[1].collider.GetComponent(); if(cell.GetOccupied()) Debug.Log("Not Accessed"); else if(temp.x == cell.transform.position.x && temp.y == cell.transform.position.y) { //判断行动点数是否够用 if(currentMovement >= cell.cost) { if(!gameManager.GetExploreMode()) ChangeMovement(-cell.cost); //改变棋子所占用的单元格 transform.position = cell.transform.position; currentCell.SetOccupied(false); currentCell.SetCurrentCharacter(null); cell.SetCurrentCharacter(this); cell.SetOccupied(true); } else { OutOfMovement(); } //陷阱地形对角色造成伤害 if(cell.damage > 0) ChangeHealth(-cell.damage); } } } //调节生命值,在血量减少或回复时调用 public void ChangeHealth(int amount) { currentHealth = Mathf.Clamp(currentHealth + amount, 0 ,maxHealth); characterUIManager.ChangePoints(amount,currentHealth / (float)maxHealth, 0); //生命值改变后血条显示改变 } //调节韧性点数 public void ChangePoise(int amount) { currentPoise = Mathf.Clamp(currentPoise + amount, 0 ,maxPoise); characterUIManager.ChangePoints(amount,currentPoise / (float)maxPoise, 1); //韧性值改变后韧性条显示改变 } //调节行动点数 public void ChangeMovement(int amount) { currentMovement += amount; movementBar.ChangeMovement(amount,currentMovement,currentMovement / (float)maxMovement); } //结束回合时重制角色行动点数 public void ReSet() { if(currentPoise <= 0) { currentPoise = maxPoise; characterUIManager.ChangePoints(0, 1, 1); currentMovement = (int)(maxMovement * 0.5); } else currentMovement = maxMovement; ChangeMovement(0); } //获取当前行动点数 public int GetCurrentMovement() { return currentMovement; } //获取当前生命值 public int GetCurrentHealth() { return currentHealth; } //角色转向 public void Turn(Vector2 direction) { lookDirection = direction; weaponManager.weapons[weaponManager.currentIndex].SetRotation(direction); animator.SetFloat("lookX", direction.x); animator.SetFloat("lookY", direction.y); } public void Dialogue() { Vector2 position = new Vector2(transform.position.x, transform.position.y); // ** 以Vector2形式保存当前位置 // ** RaycastHit2D hit = Physics2D.Raycast(position + Vector2.up * 0.2f, lookDirection, 1.5f,LayerMask.GetMask("NPC")); // ** 判断是否接触NPC if (hit.collider != null) // ** { // ** NonPlayerCharacter character = hit.collider.GetComponent(); // ** if (character != null) // ** { // ** character.DisplayDialog(); // ** } // ** // ** } // ** } //显示行动点不足 // ** public void OutOfMovement() { characterUIManager.OutOfMovement(); } //切换武器 public void GetNextWeapon() { weaponManager.weapons[weaponManager.currentIndex].gameObject.SetActive(false); weaponManager.currentIndex += 1; weaponManager.currentIndex %= 2; weaponManager.weapons[weaponManager.currentIndex].gameObject.SetActive(true); weaponManager.weapons[weaponManager.currentIndex].SetRotation(lookDirection); } private void OnDestroy() { //Debug.Log("OnDestroy was called"); RaycastHit2D hit = Physics2D.Raycast(transform.position,Vector2.up,1.0f,LayerMask.GetMask("Cells")); hit.collider.GetComponent().SetOccupied(false); gameManager.SearchPieces(); gameManager.groupCount[groupNumber] -= 1; gameManager.SetExploreMode(); } // **** 捡起物品 public void Pickup() { Vector2 position = new Vector2(transform.position.x, transform.position.y); // **** 以Vector2形式保存当前位置 // ** RaycastHit2D hit = Physics2D.Raycast(position + Vector2.up * 0.2f, lookDirection, 1.5f, LayerMask.GetMask("Item")); // **** 判断是否接触物品 if (hit.collider != null) // **** { // **** ItemInMap item = hit.collider.GetComponent(); // **** if (item != null) // **** { // **** item.AddNewItem(); // **** } // **** // ** } // **** } }