My character in your eyes

   大家说说我在你们眼里什么样,

   好的嘛,我发扬下

   缺点嘛,我能改就改,呵呵

  不需要留下姓名,随便说,我不介意

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全代码
最新发布
07-31
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值