String, new String 及 String.valueOf() 关于 == 的判定

话不多说,直接上代码吧:

String s1 = "a";
String s2 = "a";
String s3 = new String("a");
String s4 = new String("a");
String s5 = String.valueOf("a");
String s6 = String.valueOf("a");
System.out.println(s1 == s2); // true 均是指向常量池中的"",因此相等
System.out.println(s1 == s3); // false 代表堆上的对象,与 s1 不等
System.out.println(s3 == s4); // false 分别代表不同对象
System.out.println(s5 == s1); // true
System.out.println(s5 == s6); // true

附上调用关系图(图中有一个问题,我很疑惑,这个字符串常量池到底应该放在哪里,我看书上这个运行时常量池实在方法区上啊,但是看别人的博客又发现有人说是在堆上,所以到底在哪里啊?(希望有大神可以给一个完美的解释)我把它暂时放在方法区了):

在这里插入图片描述
从图中应该可以看出答案,但是还是要解释一下String.valueOf()这个方法,代码如下:
在这里插入图片描述
在这里插入图片描述
结合我上面的程序,可以推出:

String s5 = String.valu
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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值