平移物体直到碰撞
Translate object until collision
我想让我的物体一直朝着目标的方向一直运动或者直到它发生碰撞,碰撞部分我已经处理过了;但是,我的运动部分有问题。
我首先尝试使用这些代码行来旋转我的目标
Vector2 diff = target - transform.position;
float angle = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0.0f, 0.0f, angle);
这很完美,我的对象按照我想要的方向旋转。
在我的更新方法中,我有以下内容
if (isMoving)
{
Vector2 f = transform.forward;
transform.position = Vector3.MoveTowards(transform.position, target + Vector3.forward, speed * Time.deltaTime);
}
现在可以运行,但无法实现目标,我知道为什么,这是有道理的,但不确定如何解决。物体以正确的方向移动到点,但我不希望它停在目标处,我希望它继续前进。
我也试过了
rb.MovePosition(rb.position + f * Time.deltaTime * speed);
rb 是一个 rigidbody2D
以及
rb.AddForce(rb.position + f * Time.deltaTime * speed);
但在这两种情况下,对象都会旋转但不会移动
我也使用了翻译和与 MovePosition 相同的行为
P.S。这是一款 2D 游戏
在浏览互联网后,我没有找到任何真正符合我要求的东西,你无法永远平移一个运动学对象(显然你必须处理对象在某些时候应该被破坏的情况点之类的,但这不是问题)。所以我继续并决定编写自己的库来简化这个过程。我能够使用线方程实现我的目标。很简单,我采取了这些步骤来解决我的问题。
- 开始时我得到 2 点之间的斜率
- 计算 y 截距
- 使用固定X值(步长)的直线方程平移物体,每个x值找到对应的y值并将物体平移到它。
- 在 FixedUpdate 中重复第 3 步即可。
当然还有更多,处理 x = 0 的情况,这将为斜率提供 0 个除法或 y = 0,等等......我在图书馆解决了所有这些问题。对于任何感兴趣的人,您可以在此处查看 EasyMovement
如果你不想要这个库,那么这里有一个简单的代码可以做到。
//Start by Defining 5 variables
private float slope;
private float yintercept;
private float nextY;
private float nextX;
private float step;
private Vector3 direction; //This is your direction position, can be anything (e.g. a mouse click)
在开始方法
//step can be anything you want, how many steps you want your object to take, I prefer 0.5f
step = 0.5f;
//Calculate Slope => (y1-y2)/(x1-x2)
slope = (gameObject.transform.position.y - direction.y) / (gameObject.transform.position.x - direction.x);
//Calculate Y Intercept => y1-x1*m
yintercept = gameObject.transform.position.y - (gameObject.transform.position.x * slope);
现在 FixedUpdate
//Start by calculating the nextX value
//nextX
if (direction.x > 0)
nextX = gameObject.transform.position.x + step;
else
nextX = gameObject.transform.position.x - step;
//Now calcuate nextY by plugging everything into a line equation
nextY = (slope * nextX) + yintercept;
//Finally move your object into the new coordinates
gameObject.transform.position = Vector3.MoveTowards(gameObject.transform.position, new Vector3(nextX, nextY, 0), speed * Time.deltaTime);
请记住,这不会完成繁重的工作,需要考虑很多条件。
我想让我的物体一直朝着目标的方向一直运动或者直到它发生碰撞,碰撞部分我已经处理过了;但是,我的运动部分有问题。
我首先尝试使用这些代码行来旋转我的目标
Vector2 diff = target - transform.position;
float angle = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0.0f, 0.0f, angle);
这很完美,我的对象按照我想要的方向旋转。 在我的更新方法中,我有以下内容
if (isMoving)
{
Vector2 f = transform.forward;
transform.position = Vector3.MoveTowards(transform.position, target + Vector3.forward, speed * Time.deltaTime);
}
现在可以运行,但无法实现目标,我知道为什么,这是有道理的,但不确定如何解决。物体以正确的方向移动到点,但我不希望它停在目标处,我希望它继续前进。
我也试过了
rb.MovePosition(rb.position + f * Time.deltaTime * speed);
rb 是一个 rigidbody2D
以及
rb.AddForce(rb.position + f * Time.deltaTime * speed);
但在这两种情况下,对象都会旋转但不会移动
我也使用了翻译和与 MovePosition 相同的行为
P.S。这是一款 2D 游戏
在浏览互联网后,我没有找到任何真正符合我要求的东西,你无法永远平移一个运动学对象(显然你必须处理对象在某些时候应该被破坏的情况点之类的,但这不是问题)。所以我继续并决定编写自己的库来简化这个过程。我能够使用线方程实现我的目标。很简单,我采取了这些步骤来解决我的问题。
- 开始时我得到 2 点之间的斜率
- 计算 y 截距
- 使用固定X值(步长)的直线方程平移物体,每个x值找到对应的y值并将物体平移到它。
- 在 FixedUpdate 中重复第 3 步即可。
当然还有更多,处理 x = 0 的情况,这将为斜率提供 0 个除法或 y = 0,等等......我在图书馆解决了所有这些问题。对于任何感兴趣的人,您可以在此处查看 EasyMovement
如果你不想要这个库,那么这里有一个简单的代码可以做到。
//Start by Defining 5 variables
private float slope;
private float yintercept;
private float nextY;
private float nextX;
private float step;
private Vector3 direction; //This is your direction position, can be anything (e.g. a mouse click)
在开始方法
//step can be anything you want, how many steps you want your object to take, I prefer 0.5f
step = 0.5f;
//Calculate Slope => (y1-y2)/(x1-x2)
slope = (gameObject.transform.position.y - direction.y) / (gameObject.transform.position.x - direction.x);
//Calculate Y Intercept => y1-x1*m
yintercept = gameObject.transform.position.y - (gameObject.transform.position.x * slope);
现在 FixedUpdate
//Start by calculating the nextX value
//nextX
if (direction.x > 0)
nextX = gameObject.transform.position.x + step;
else
nextX = gameObject.transform.position.x - step;
//Now calcuate nextY by plugging everything into a line equation
nextY = (slope * nextX) + yintercept;
//Finally move your object into the new coordinates
gameObject.transform.position = Vector3.MoveTowards(gameObject.transform.position, new Vector3(nextX, nextY, 0), speed * Time.deltaTime);
请记住,这不会完成繁重的工作,需要考虑很多条件。