using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
public enum Battle { Start, PlayerTurn, EnemyTurn, Lose, Win }
public class BattleSystem : MonoBehaviour
{ public enum gameover{win,lose}
public Battle State;
public float typingSpeed = 0.05f;
private bool isTyping = false;
public GameObject PlayerPrefeb;
public GameObject EnemyPrefeb;
public Transform PlayerPosition;
public Transform EnemyPosition;
private Playermessage playerpeople;
private Enemymessage emenypeople;
public EnemyBattleHUD enemyHUD;
public PlayerBattleHUD playerHUD;
public TextMeshProUGUI Text;
public GameObject F;
public GameObject m;
public GameObject back;
public GameObject select1;
public GameObject select2;
public Color flash;
private Color Originalcolor;
public float Time;
public UnityEngine.UI.Image image;
public Animator animator;
private Camera mainCamera;
private Vector3 originalCameraPosition;
public UnityEngine.UI.Image attackphoto;
public UnityEngine.UI.Image attackphoto2;
void Start()
{ mainCamera = Camera.main;
if (mainCamera != null)
{
originalCameraPosition = mainCamera.transform.localPosition;
}
State = Battle.Start;
StartCoroutine(SetupBattle());
}
private IEnumerator SetupBattle()
{
GameObject player = Instantiate(PlayerPrefeb, PlayerPosition);
playerpeople = player.GetComponent<Playermessage>();
GameObject emeny = Instantiate(EnemyPrefeb, EnemyPosition);
emenypeople = emeny.GetComponent<Enemymessage>();
playerHUD.SetHUD(playerpeople);
enemyHUD.SetHUD(emenypeople);
// 显示开场信息(带打字效果)
yield return StartCoroutine(TypeText("Let me feel your power now, don't make me bored^_^", 0.5f));
yield return new WaitForSeconds(0.5f);
if (F != null) F.SetActive(false);
if (m != null) m.SetActive(true);
yield return StartCoroutine(TypeText("I can't lose here", 0.5f));
yield return new WaitForSeconds(0.5f);
if (m != null) m.SetActive(false);
yield return StartCoroutine(TypeText("--Please consider your decision--", 2f));
State = Battle.PlayerTurn;
PlayerTurn();
}
// 玩家回合逻辑
private void PlayerTurn()
{
StartCoroutine(TypeText("Choose your action...", 0f));
}
public void OnAttackButton()
{
if (State != Battle.PlayerTurn)
return;
StartCoroutine(PlayerAttack());
}
private IEnumerator PlayerAttack()
{
yield return StartCoroutine(TypeText("Get out of my way!!!", 0f));
yield return new WaitForSeconds(1f);
attackphoto.gameObject.SetActive(true);
// 使用新的伤害计算方法
float damageDealt = player.CalculateDamage();
yield return StartCoroutine(TypeText($"Dealt {damageDealt} damage!", 0f));
yield return new WaitForSeconds(1f);
attackphoto.gameObject.SetActive(false);
// 调用新的TakeDamage方法
bool IsDead = emenypeople.TakeDamage(damageDealt);
enemyHUD.SetHUD(emenypeople);
if (IsDead)
{
State = Battle.Win;
EndBattle();
}
else
{
State = Battle.EnemyTurn;
StartCoroutine(EnemyTurn());
}
}
private IEnumerator EnemyTurn()
{
yield return StartCoroutine(TypeText("Looking my eyes...", 0f));
yield return new WaitForSeconds(0.5f);
attackphoto2.gameObject.SetActive(true);
yield return new WaitForSeconds(0.5f);animator.SetTrigger("shake");
StartCoroutine(ShakeCamera(0.4f, 0.4f));
Originalcolor = image.color;
StartCoroutine(flashboom());
attackphoto2.gameObject.SetActive(false);
float damageDealt = GetComponent<SpeacialAttack>().GetDamage();
yield return StartCoroutine(TypeText($"Took {damageDealt} damage!", 0f));
bool IsDead = playerpeople.TakeDamage();
playerHUD.SetHUD(playerpeople);
yield return new WaitForSeconds(1f);
if (IsDead)
{
State = Battle.Lose;
EndBattle();
}
else
{
State = Battle.PlayerTurn;
PlayerTurn();
}
}
private void EndBattle()
{
if (State == Battle.Win)
{
StartCoroutine(TypeText("Victory is mine!", 0f));
EndBattle(true);
}
else if (State == Battle.Lose)
{
StartCoroutine(TypeText("Defeat... I'll be back!", 0f));
EndBattle(false);
}
select1.SetActive(false);
select2.SetActive(false);
back.SetActive(true);
}
const string BATTLE_RESULT_KEY = "LastBattleResult";
public void EndBattle(bool isWin)
{
PlayerPrefs.SetInt(BATTLE_RESULT_KEY, isWin ? 1 : 0);
PlayerPrefs.Save();
SceneManager.LoadScene("Traning");
}
IEnumerator flashboom()//受击红屏效果
{
image.color = flash;
yield return new WaitForSeconds(Time);
image.color = Originalcolor;
}
private IEnumerator ShakeCamera(float duration = 0.5f, float magnitude = 0.4f)
{
Vector3 originalPos = mainCamera.transform.localPosition;
float elapsed = 0f;
AnimationCurve attenuationCurve = AnimationCurve.EaseInOut(0, 1, 1, 0);
while (elapsed < duration)
{
float attenuation = attenuationCurve.Evaluate(elapsed / duration);
float x = Mathf.PerlinNoise(UnityEngine.Time.time * 30f, 0) * 2 - 1;
float y = Mathf.PerlinNoise(0, UnityEngine.Time.time * 30f) * 2 - 1;
// 5. 应用衰减后的震动幅度
Vector3 shakeOffset = new Vector3(x, y, 0) * magnitude * attenuation;
mainCamera.transform.localPosition = originalPos + shakeOffset;
// 6. 使用unscaledDeltaTime确保时间精确
elapsed += UnityEngine.Time.unscaledDeltaTime;
yield return null;
}
// 7. 平滑回归原位
float returnDuration = 0.2f;
float returnElapsed = 0f;
Vector3 currentPos = mainCamera.transform.localPosition;
while (returnElapsed < returnDuration)
{
mainCamera.transform.localPosition = Vector3.Lerp(
currentPos,
originalPos,
returnElapsed / returnDuration
);
returnElapsed += UnityEngine.Time.unscaledDeltaTime;
yield return null;
}
mainCamera.transform.localPosition = originalPos;
}
public IEnumerator TypeText(string sentence, float initialDelay = 0f)
{
if (Text == null) yield break;
isTyping = true;
yield return new WaitForSeconds(initialDelay);
Text.text = "";
foreach (char letter in sentence.ToCharArray())
{
Text.text += letter;
yield return new WaitForSeconds(typingSpeed);
}
isTyping = false;
}
}using UnityEngine;
[System.Serializable]
public class Playermessage : MonoBehaviour
{
// 角色基本属性
[Header("角色属性")]
public string characterName;
public int level = 100;
public float attackPower=50;
public float defense;
public float maxHealth;
[SerializeField] private float currentHealth;
// 伤害计算参数
[Header("伤害计算")]
public float criticalChance = 0.5f;
public float criticalMultiplier = 1.5f;
public float damageRandomness = 0.1f;
// 属性访问器
public float CurrentHealth => currentHealth;
// 初始化
private void Start()
{
currentHealth = maxHealth;
}
// 伤害计算核心方法
public float CalculateDamage()
{
// 基础伤害 = 攻击力 * (1 ± 随机波动)
float baseDamage = attackPower * (1 + Random.Range(-damageRandomness, damageRandomness));
// 暴击判定
if (Random.value <= criticalChance)
{
baseDamage *= criticalMultiplier;
Debug.Log($"暴击! 伤害: {baseDamage}");
}
return Mathf.Max(1, baseDamage); // 确保最小伤害为1
}
// 受到伤害处理
public bool TakeDamage(float incomingDamage)
{
// 实际伤害 = 输入伤害 - 防御力 (至少造成1点伤害)
float actualDamage = Mathf.Max(1, incomingDamage - defense);
// 更新生命值
currentHealth -= actualDamage;
currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
Debug.Log($"{characterName}受到{actualDamage}点伤害, 剩余生命值: {currentHealth}/{maxHealth}");
// 返回是否死亡
return currentHealth <= 0;
}
}
using UnityEngine;
[System.Serializable]
public class Enemymessage : MonoBehaviour
{
// 角色基本属性
[Header("角色属性")]
public string characterName;
public int level = 1;
public float attackPower=50;
public float defense;
public float maxHealth;
[SerializeField] private float currentHealth;
// 伤害计算参数
[Header("伤害计算")]
public float criticalChance = 0.5f;
public float criticalMultiplier = 1.5f;
public float damageRandomness = 0.1f;
// 属性访问器
public float CurrentHealth => currentHealth;
// 初始化
private void Start()
{
currentHealth = maxHealth;
}
// 伤害计算核心方法
public float CalculateDamage()
{
// 基础伤害 = 攻击力 * (1 ± 随机波动)
float baseDamage = attackPower * (1 + Random.Range(-damageRandomness, damageRandomness));
// 暴击判定
if (Random.value <= criticalChance)
{
baseDamage *= criticalMultiplier;
Debug.Log($"暴击! 伤害: {baseDamage}");
}
return Mathf.Max(1, baseDamage); // 确保最小伤害为1
}
// 受到伤害处理
public bool TakeDamage(float incomingDamage)
{
// 实际伤害 = 输入伤害 - 防御力 (至少造成1点伤害)
float actualDamage = Mathf.Max(1, incomingDamage - defense);
// 更新生命值
currentHealth -= actualDamage;
currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
Debug.Log($"{characterName}受到{actualDamage}点伤害, 剩余生命值: {currentHealth}/{maxHealth}");
// 返回是否死亡
return currentHealth <= 0;
}
}
using UnityEngine;
[System.Serializable]
public class Enemymessage : MonoBehaviour
{
// 角色基本属性
[Header("角色属性")]
public string characterName;
public int level = 1;
public float attackPower=50;
public float defense;
public float maxHealth;
[SerializeField] private float currentHealth;
// 伤害计算参数
[Header("伤害计算")]
public float criticalChance = 0.5f;
public float criticalMultiplier = 1.5f;
public float damageRandomness = 0.1f;
// 属性访问器
public float CurrentHealth => currentHealth;
// 初始化
private void Start()
{
currentHealth = maxHealth;
}
// 伤害计算核心方法
public float CalculateDamage()
{
// 基础伤害 = 攻击力 * (1 ± 随机波动)
float baseDamage = attackPower * (1 + Random.Range(-damageRandomness, damageRandomness));
// 暴击判定
if (Random.value <= criticalChance)
{
baseDamage *= criticalMultiplier;
Debug.Log($"暴击! 伤害: {baseDamage}");
}
return Mathf.Max(1, baseDamage); // 确保最小伤害为1
}
// 受到伤害处理
public bool TakeDamage(float incomingDamage)
{
// 实际伤害 = 输入伤害 - 防御力 (至少造成1点伤害)
float actualDamage = Mathf.Max(1, incomingDamage - defense);
// 更新生命值
currentHealth -= actualDamage;
currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
Debug.Log($"{characterName}受到{actualDamage}点伤害, 剩余生命值: {currentHealth}/{maxHealth}");
// 返回是否死亡
return currentHealth <= 0;
}
}我现在更新了后面两个脚本,帮我修改BattleSystem,写出BattleSystem全代码
最新发布