【问题标题】:How to raycasting to player facing direction?如何将光线投射到面向方向的玩家?
【发布时间】:2021-09-07 08:44:33
【问题描述】:

在我的 2D 自上而下的游戏中,我试图将一条光线从我的玩家投射到他所面对的方向。一切都很顺利,但问题是玩家停止移动光线投射的那一刻(这很有意义,我正在使用 Input.GetAxis,它在停止移动时返回值 0)。我一直在尝试使用 Transform.right / TransformDirection 它只是让光线停留在同一位置,而不是玩家面对的位置。即使我的播放器停止移动,我有什么方法可以让光线投射继续进行吗?

    public Collider2D GetBarrleCollider()
    {

        Physics2D.queriesStartInColliders = false;
        RaycastHit2D hit = Physics2D.Raycast(this.transform.position, movement, playerDistance);
        if (hit.collider != null && hit.collider.gameObject.CompareTag("Pickup"))
        {
            Debug.Log("Return NOT null" + " " + hit.collider.tag);
            return hit.collider;
        }
        else
        {
            Debug.Log("Return null");
            return null;
        }
    }

public void MovementHandler()
    {

            movement.x = Input.GetAxisRaw("Horizontal");
            movement.y = Input.GetAxisRaw("Vertical");

        rb2D.MovePosition(rb2D.position + movement * getPlayerMovementSpeed * Time.deltaTime);
  }

【问题讨论】:

  • 您没有显示在什么条件下完成光线投射以及与问题似乎所在的 Input.GetAxis 的关系。我会显示所有可能出现问题的代码
  • 将光线投射代码移到 GetAxis.. 条件之外。 transform.forward 会给你玩家面对的方向。
  • 只是更新我所做的,使脚本工作。我需要确保最后一个方向已保存为矢量 2,所以我只是创建了一个新矢量 2 并在那里保存了当前的运动方向,让玩家知道一直在哪里看 If(movement != Vector2.Zero){ faceDirection = 运动; }

标签: c# unity3d raycasting


【解决方案1】:

您可以将方向存储为变量。让我们称之为lookDir。然后你应该检查运动向量是否不为零:

Vector2 lookDir;

public void MovementHandler()
{
    movement.x = Input.GetAxisRaw("Horizontal");
    movement.y = Input.GetAxisRaw("Vertical");
    rb2D.MovePosition(rb2D.position + movement * getPlayerMovementSpeed * Time.deltaTime);

    if (movement != Vector2.zero)
    {
        lookDir = movement;
    }
}

然后你可以从这个向量进行光线投射。这样,您只有在玩家移动时才更改它。

这样的事情应该可以工作:

public void MovementHandler()
{
    movement.x = Input.GetAxisRaw("Horizontal");
    movement.y = Input.GetAxisRaw("Vertical");
    rb2D.MovePosition(rb2D.position + movement * getPlayerMovementSpeed * Time.deltaTime);

    if (movement != Vector2.zero)
    {
        lookDir = movement;
    }
}
public Collider2D GetBarrleCollider()
{
    Physics2D.queriesStartInColliders = false;

    //this line was changed \/
    RaycastHit2D hit = Physics2D.Raycast(this.transform.position, lookDir, playerDistance);
    //

    if (hit.collider != null && hit.collider.gameObject.CompareTag("Pickup"))
    {
        Debug.Log("Return NOT null" + " " + hit.collider.tag);
        return hit.collider;
    }
    else
    {
        Debug.Log("Return null");
        return null;
    }
}

如果这不起作用,请在 cmets 中告诉我。

【讨论】:

  • 感谢重播。这正是我所做的,我已经在 cmets 中更新了它:) thnx!可能会帮助其他人:)
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多