簡體   English   中英

unity2D 中的光線投射

[英]Raycasts in unity2D

我正在嘗試創建一個腳本,該腳本將使游戲 object 在檢測到某些東西時沿着光線投射移動,並且由於某種原因,3d 中的某些東西正在發生並弄亂光線投射方向

'''

using UnityEngine;

public class CreatureActivity : MonoBehaviour
{
    float sense = 2;
    float speed = .05f;
    LayerMask LayerMask = 8;

    private void Start()
    {
        Physics2D.queriesStartInColliders = false;
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        Vector2 position = new Vector2(transform.position.x, transform.position.y);

        Vector2 right = new Vector2(position.x + 1, position.y);
        Vector2 left = new Vector2(position.x - 1, position.y);
        Vector2 up = new Vector2(position.x, position.y + 1);
        Vector2 down = new Vector2(position.x, position.y - 1);

        RaycastHit2D hitInfoR = Physics2D.Raycast(position, right, sense);
        RaycastHit2D hitInfoL = Physics2D.Raycast(position, left, sense);
        RaycastHit2D hitInfoU = Physics2D.Raycast(position, up, sense);
        RaycastHit2D hitInfoD = Physics2D.Raycast(position, down, sense);
        //right ray
        if (hitInfoR.collider != null)
        {
            transform.position = Vector2.MoveTowards(transform.position, right, speed);
            Debug.DrawLine(position, hitInfoR.point, Color.red);
        }
        else
        {
            Debug.DrawLine(position, position + right * 2, Color.green);
        }
        
        //left ray
        if (hitInfoL.collider != null)
        {
            transform.position = Vector2.MoveTowards(position, left, speed);
            Debug.DrawLine(position, hitInfoR.point, Color.red);
        }
        else
        {
            Debug.DrawLine(position, position + left * 2, Color.green);
        }
        //up ray
        if (hitInfoU.collider != null)
        {
            transform.position = Vector2.MoveTowards(position, up, speed);
            Debug.DrawLine(position, hitInfoR.point, Color.red);
        }
        else
        {
            Debug.DrawLine(position, position + up * 2, Color.green);
        }
        //down ray
        if (hitInfoD.collider != null)
        {
            transform.position = Vector2.MoveTowards(position, down, speed);
            Debug.DrawLine(position, hitInfoR.point, Color.red);
        }
        else
        {
            Debug.DrawLine(position, position + down * 2, Color.green);
        }
        
    }
}

''' 你可以忽略這部分堆棧溢出要我添加更多細節但我不知道還要添加什么。

主要錯誤是: Vector2.MoveTowards期望當前 position目標 position ..不是一個方向作為參數。

而不是例如

transform.position = Vector2.MoveTowards(transform.position, right, speed);

你寧願使用

transform.position = Vector2.MoveTowards(position, position + right, speed);

現在這仍然是錯誤的嗎? 如果你的命中更近了怎么辦。 前面提到的解決方案可能會過沖。 所以你寧願使用實際的最大目標 position 並簡單地使用

transform.position = Vector2.MoveTowards(position, hitInfoR.point, speed);

不過還有一些注意事項

  • 如果您的多個光線投射擊中某些東西怎么辦?

    → 您寧願一次進行一次 Raycast 檢查,並在第一個命中后停止。

  • 而且您知道已經存在Vector2.upVector2.downVector2.rightVector2.left嗎?

  • 通常Vector2 is a struct並按值存儲,因此像這樣的一行

    Vector2 position = new Vector2(transform.position.x, transform.position.y);

    是相當多余的..只是做

    Vector2 position = transform.position;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM