Java中如何在另一个类的方法里修改对象属性值(游戏开发场景)
问题分析与解决方案
兄弟,我太懂这种抓耳挠腮的感觉了!当初我做手游开发时也碰到过几乎一模一样的问题——在别的类里改了对象的属性,那边能看到变化,切回原类就又变回初始值,折腾了快一下午才搞明白。核心问题大概率逃不出这两种情况:
1. 你传递的是值类型的副本,而非对象引用
如果你的x是int、float这类值类型,直接把x传给另一个类的方法时,传递的其实是它的副本——你在另一个类里改的只是这个副本,原对象的x根本没被碰过。举个直观的例子:
// 你的第一个类(比如Player角色类) public class Player { public int x = 0; // 初始值0 } // 负责更新的第二个类(比如GameManager) public class GameManager { // 错误写法:这里接收的是x的副本 public void UpdatePosition(int xValue) { xValue = 10; // 改的是副本,和原Player的x没关系 } } // 调用场景 Player myPlayer = new Player(); GameManager gm = new GameManager(); gm.UpdatePosition(myPlayer.x); Debug.Log(myPlayer.x); // 输出还是0!
解决办法:
要么传递整个对象(引用类型,修改的是同一个实例),要么用ref/out关键字绑定值类型的引用:
// 方案1:传递整个Player对象(推荐,游戏开发里常用) public void UpdatePosition(Player targetPlayer) { targetPlayer.x = 10; // 直接修改原对象的属性 } // 调用时:gm.UpdatePosition(myPlayer); // 方案2:用ref关键字绑定值类型引用 public void UpdatePosition(ref int xValue) { xValue = 10; } // 调用时:gm.UpdatePosition(ref myPlayer.x);
2. 两个作用域用的是不同的对象实例
另一种常见情况是:你在第一个类里创建了一个对象,但在第二个类里又重新new了一个新的实例——你改的是新实例的x,原实例的x自然还是初始值0。比如:
// 第一个类的启动方法 public void StartGame() { Player myPlayer = new Player(); GameManager gm = new GameManager(); gm.DoUpdate(); Debug.Log(myPlayer.x); // 输出0,因为gm里改的是另一个Player } // GameManager里的错误写法 public class GameManager { public void DoUpdate() { Player anotherPlayer = new Player(); // 又新建了一个实例! anotherPlayer.x = 10; } }
解决办法:
确保两个类操作的是同一个对象实例,游戏开发里常用这几种方式:
- 构造函数注入:在创建第二个类实例时,把第一个类的对象传进去
- 单例模式:把需要全局共享的对象做成单例(比如
Player.Instance) - 参数传递:每次调用方法时把对象传进去
举个构造函数注入的例子:
public class GameManager { private Player _boundPlayer; // 构造时传入要操作的Player实例 public GameManager(Player targetPlayer) { _boundPlayer = targetPlayer; } public void DoUpdate() { _boundPlayer.x = 10; // 改的是传入的那个实例 } } // 调用时 Player myPlayer = new Player(); GameManager gm = new GameManager(myPlayer); gm.DoUpdate(); Debug.Log(myPlayer.x); // 现在输出10了!
额外提醒(游戏开发专属坑)
如果你用的是Unity、Unreal这类引擎,还要注意:
- 不要在
Awake()/Start()这类生命周期方法里重复创建对象,全局共享的对象优先用单例模式 - 检查原类的代码,有没有在某个地方(比如Update循环里)把
x重新设回0了,这种隐形重置很容易被忽略
内容的提问来源于stack exchange,提问作者Aymen Bou
相关产品推荐
相关产品推荐

