c# - Unity 不更新对象 transform.position
问题描述
我正在开发一个小型 2d 游戏,您可以在其中控制一个行星以躲避来袭的小行星。我正在通过以下方式实现重力:
public class Gravity : MonoBehaviour
{
Rigidbody2D rb;
Vector2 lookDirection;
float lookAngle;
[Header ("Gravity")]
// Distance where gravity works
[Range(0.0f, 1000.0f)]
public float maxGravDist = 150.0f;
// Gravity force
[Range(0.0f, 1000.0f)]
public float maxGravity = 150.0f;
// Your planet
public GameObject planet;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// Distance to the planet
float dist = Vector3.Distance(planet.transform.position, transform.position);
// Gravity
Vector3 v = planet.transform.position - transform.position;
rb.AddForce(v.normalized * (1.0f - dist / maxGravDist) * maxGravity);
// Rotating to the planet
lookDirection = planet.transform.position - transform.position;
lookAngle = Mathf.Atan2(lookDirection.y, lookDirection.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, lookAngle);
}
}
问题是小行星被吸引到行星的初始生成点 (0,0),它不会随着行星的运动实时更新。因此,如果我将行星移动到屏幕的一角,小行星仍然会被吸引到它的中心。
当我对每个值使用 Debug.Log 时,除了planet.transform.position 保持在 0,0,0 之外,所有值都会发生变化,即使在移动它之后也是如此。
是行星刚体的问题吗?有什么设置吗?我有点失落。
有没有办法解决这个问题?
非常感谢您,并原谅任何公然错误!
解决方案
因为小行星是从预制件动态生成的,所以它们不是游戏对象,在脚本的游戏对象变量上选择的行星是预制件,而不是场景中的真实游戏对象。我必须将此行添加到我的生成器脚本中
如果(间隔>随机){
GameObject newAsteroid = Instantiate(asteroidPrefab, GetRandomPosition(), Quaternion.identity);
newAsteroid.GetComponent().planet = 行星;
}
并在变量的顶部添加
公共游戏对象星球;
在编辑器的生成器脚本中,拖放你的星球游戏对象
这解决了这个问题。
推荐阅读
- android - LoginActivity 泄露了最初添加在这里的窗口 DecorView@bb62df1[LoginActivity]
- php - 如何在php中将两个数字相乘
- chef-infra - Chef Elementory OS(在资源“包 [apache2]”上执行操作“安装”时出错)
- uwp - 更新 ContentControl 时如何避免闪烁?
- visual-studio-code - vscode cppdbg 启动 json 中 setupCommands 的文档
- spring-boot - 用于 Spring Boot 2.2.4.RELEASE 的 keycloak-spring-boot-starter
- react-native - 仅在 iOS 上没有弹出询问权限,未确定权限,react-native-community/geolocation
- r - 通过在 R Shiny 中填充 iframe 来删除空格
- laravel - Laravel 中的自定义规则类 - 如何让消息正常工作?
- ruby-on-rails - 将集合与相关对象分组