我在做一个游戏,我有一个骨架作为游戏对象:

因为这具骷髅是敌人,所以我想让它自己行走,当它到达边缘的时候,转身,以此类推。我设法让它像这样走路:
void Update() {
if (isWalking) {
body.velocity = new Vector2((isFacingLeft ? -1 : 1) * speed, body.velocity.y);
.
.
.为了测试目的,从一开始就将isWalking设置为true,speed是5,而isFacingLeft是一个布尔值,我想在骨架到达边缘时翻转它,最初是false,所以骨架不间断地向右移动。
因此,我的想法是使用OnCollisionEnter2D,因为骨架位于平台游戏对象的顶部,并且使用碰撞对象获得不同的界限:

从图片上看,如果游戏对象平台可以被称为L和它的宽度y,那么我正在考虑通过查找Lx和Lx +y来获得它的必要界限。然后,如果骨架的宽度可以被称为x,我想测量骨架的transform.position.x并检查:如果它面向右,transform.position.x > Lx + y - x (或者x / 2来接近它的边缘一点),然后翻转isFacingLeft布尔值。如果它面向左侧和transform.position.x < Lx + x (或x / 2),则翻转布尔值。
但是,如果我尝试记录左侧边缘(通过collider.transform.position.x)和骨架位置(通过transform.position.x),就会得到6.4596, 5.943441的起始值,这意味着骨架在平台之前就开始了。在这种情况下,是否可能transform不是检查边界的正确属性?那么,如何确保我使用所需的值来检查边呢?如果有人知道,请评论,即使你对我的方法有疑问,因为仔细的思考过程确实有助于得到一个答案。
发布于 2022-02-28 01:59:06
因此,就像reddit上的pocokknight建议的那样,我尝试实施射线投射,这样就有一条射线从骨架精灵的下角投射出来,这取决于它应该面对的位置,可以通过SpriteRenderer.bounds.size实现。如果光线投射没有击中任何位置,骨架将面临翻转。这使骨架能够永远来回旋转:)
RaycastHit2D hit = Physics2D.Raycast(new Vector2(transform.position.x + ((enemyWidth / 2) * direction), transform.position.y - enemyHeight / 2), transform.TransformDirection(new Vector2(1 * (direction), -1)), 1f);


当然,这是函数的一个非常简单的执行,我可能会想到光线投射检查可能失败的场景(比如如果player对象在其路径上应该检查空区域),但到目前为止,这是一个我很满意的进展。
https://stackoverflow.com/questions/71273557
复制相似问题