C# LineRender |与raycast2D碰撞

C# LineRender |与raycast2D碰撞,c#,unity3d,C#,Unity3d,我建立了一个游戏,你可以控制他的移动线。 每隔几秒,线就会产生一个洞,玩家可以穿过它。 看图片: 现在,在我的代码中,您可以看到playerMovement、createLine和drawLine。 我根据球员的位置画线,每隔几秒我就停下来画米利秒来创造一个洞,然后再画一条新的线 我的代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class DrawL

我建立了一个游戏,你可以控制他的移动线。 每隔几秒,线就会产生一个洞,玩家可以穿过它。 看图片:

现在,在我的代码中,您可以看到playerMovement、createLine和drawLine。 我根据球员的位置画线,每隔几秒我就停下来画米利秒来创造一个洞,然后再画一条新的线

我的代码:

    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawLineNisayon : MonoBehaviour
{

[SerializeField] private GameObject linePrefab;
LineRenderer lineRenderer;
public GameObject currentLine;

private bool createHole = false;
private bool drawLine = false;
float rotZ = 0f;

public float speedMovement = 3f;
public float speedRotation = 6f;
public float timingCreateHoles = 2f;
public float widthHoles = 0.2f;

public EdgeCollider2D edgeCollider2D;
public List<Vector2> posLine;

void Start()
{
    CreateLine();
}

void Update()
{
    PlayerMovement(speedMovement);
    DrawLine();
}

private void CreateLine()
{
    currentLine = Instantiate(linePrefab, Vector3.zero, Quaternion.identity);
    lineRenderer = currentLine.GetComponent<LineRenderer>();
    edgeCollider2D = currentLine.GetComponent<EdgeCollider2D>();
    posLine.Clear();
    posLine.Add(transform.position);
    posLine.Add(transform.position);
    lineRenderer.SetPosition(0, posLine[0]);
    lineRenderer.SetPosition(1, posLine[1]);
    edgeCollider2D.points = posLine.ToArray();

}

private void DrawLine()
{
    if(!drawLine)
    {
        posLine.Add(transform.position);
        lineRenderer.positionCount++;
        lineRenderer.SetPosition(lineRenderer.positionCount - 1, transform.position);
        edgeCollider2D.points = posLine.ToArray();

        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.right, 1f);
        Debug.DrawRay(posLine[lineRenderer.positionCount - 1], transform.right);

        if(createHole == false){
            StartCoroutine(DrawHole(timingCreateHoles));
            createHole = true;
        } 
    }  
}

private IEnumerator DrawHole(float timingCreateHoles)
{

    yield return new WaitForSeconds(timingCreateHoles);
    drawLine = true;
    StartCoroutine(DrawLine(widthHoles));
}

private IEnumerator DrawLine(float widthHoles)
{
    yield return new WaitForSeconds(widthHoles);
    CreateLine();
    drawLine = false;
    createHole = false;
}

private void PlayerMovement(float speed)
{
    transform.Translate(Vector3.right * speed * Time.deltaTime);

    if(Input.GetKey(KeyCode.D) && !Input.GetKey(KeyCode.A))
    {
        transform.Rotate(0f, 0f, rotZ);
        rotZ = speedRotation;
    }

    if (!Input.GetKey(KeyCode.D) && Input.GetKey(KeyCode.A))
    {
        transform.Rotate(0f, 0f, rotZ);
        rotZ = -speedRotation;
    }
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类DrawLineNisayon:MonoBehavior
{
[SerializeField]私有游戏对象LinePrefact;
线条渲染器线条渲染器;
公共游戏对象线;
private bool createHole=false;
私有布尔抽绳=假;
浮动旋转Z=0f;
公共浮动速度移动=3f;
公共浮动速度旋转=6f;
公共浮点数计时CreateHoles=2f;
公共浮球宽度=0.2f;
公共边缘准直器2D边缘准直器2D;
公共列表行;
void Start()
{
CreateLine();
}
无效更新()
{
玩家移动(速度移动);
抽绳();
}
私有void CreateLine()
{
currentLine=实例化(linePrefab,Vector3.zero,Quaternion.identity);
lineRenderer=currentLine.GetComponent();
edgeCollider2D=currentLine.GetComponent();
posLine.Clear();
posLine.Add(transform.position);
posLine.Add(transform.position);
SetPosition(0,posLine[0]);
SetPosition(1,posLine[1]);
edgeCollider2D.points=posLine.ToArray();
}
专用抽绳()
{
如果(!抽绳)
{
posLine.Add(transform.position);
lineRenderer.positionCount++;
lineRenderer.SetPosition(lineRenderer.positionCount-1,transform.position);
edgeCollider2D.points=posLine.ToArray();
RaycastHit2D hit=Physics2D.Raycast(transform.position,Vector2.right,1f);
DrawRay(posLine[lineRenderer.positionCount-1],transform.right);
如果(createHole==false){
开始例行程序(绘图孔(计时创建孔));
createHole=true;
} 
}  
}
专用IEnumerator绘图孔(浮动计时CreateHoles)
{
产生返回新WaitForSeconds(计时创建孔);
抽绳=真;
开始例行程序(抽绳(宽度孔));
}
专用IEnumerator抽绳(浮动宽度孔)
{
产生返回新WaitForSeconds(宽度孔);
CreateLine();
抽绳=假;
createHole=false;
}
专用无效播放器移动(浮动速度)
{
transform.Translate(Vector3.right*速度*时间.deltaTime);
if(Input.GetKey(KeyCode.D)和&!Input.GetKey(KeyCode.A))
{
变换。旋转(0f,0f,旋转);
rotZ=速度旋转;
}
if(!Input.GetKey(KeyCode.D)和&Input.GetKey(KeyCode.A))
{
变换。旋转(0f,0f,旋转);
rotZ=-速度旋转;
}
}
}
那么我的问题是什么?我尝试创建raycast来检查与线本身的碰撞,就像游戏“蛇”一样。我试图在函数“DrawLine”中创建光线投射,但我不知道如何做到这一点。 我的行是由向量2列表构建的,就像你们在我的代码中看到的,它说我需要比较向量和向量,我不知道如何


*我尝试与行中的最后一个索引碰撞,而不是与图片中的圆圈碰撞。

如果您阅读unity文档,则在碰撞器内启动时,所有光线投射都会表现得很有趣。。当然,你可以掩盖事情,或者,确保你从一个碰撞之外开始。我尝试了很多方法,但仍然没有成功。我尝试使用函数edgeCollider2D.Raycast,然后创建了命中数组,并检查命中是否不是最后一个索引,是否无效/:好吧,上面的代码中没有掩码,也没有在对象上的任何碰撞器之外启动,因此,很难知道您的新尝试是什么,或者,为什么在没有支持代码的情况下它们可能会失败我尝试过这样做:RaycastHit2D[]hits=Physics2D.RaycastAll(lineRenderer.GetPosition(lineRenderer.positionCount-1),transform.right);edgeCollider2D.Raycast(矢量2.right,点击次数);对于(int i=0;i