C# 光线投射(Circlecast)和对象方向不相同

C# 光线投射(Circlecast)和对象方向不相同,c#,unity3d,C#,Unity3d,我试图画一条虚线,显示球落在哪里,并从那里反射。我用的是unity的物理系统 我认为圆投射和线渲染器有问题 无论我在哪里用鼠标点击,球都会在那里繁殖。因此,我认为BallCreate()函数没有任何问题 问题就在这里 如图所示,球在transform.position上实例化并通过hit.point。不知何故,线渲染器和球的方向不一样。总有一点不同(有时更大) 代码如下: 我想在一周内解决这个问题,任何帮助都很重要 using System.Collections; using System.

我试图画一条虚线,显示球落在哪里,并从那里反射。我用的是unity的物理系统

我认为圆投射和线渲染器有问题

无论我在哪里用鼠标点击,球都会在那里繁殖。因此,我认为BallCreate()函数没有任何问题

问题就在这里

如图所示,球在transform.position上实例化并通过hit.point。不知何故,线渲染器和球的方向不一样。总有一点不同(有时更大)

代码如下:

我想在一周内解决这个问题,任何帮助都很重要

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

public Transform BallPrefab = null;
bool ShootDirected = true;
Vector3 mousePos;
private LineRenderer linerender;
RaycastHit2D hitx;
private Vector3 dir;
private Vector3 origin;
void Start()
{
    linerender = GetComponent<LineRenderer>();  
}
void Update()
{

    mousePos = new Vector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y, 0);
    //Direction according to mouse position.
    dir = mousePos - transform.position;

    origin = transform.position;

    //First hit point 0.3307159f is the radius of the ball.
    RaycastHit2D hit = Physics2D.CircleCast(origin, 0.3307159f, dir, 100f, 1 << 9 | 1<<10);

    if (hit.collider != null)
    {
        //Stored reflected hit point.
        Vector2 reflectDir = Vector2.Reflect(dir, hit.normal);

        //Then start second ray from hit point thru reflected hit point.
        RaycastHit2D SecondHit = Physics2D.CircleCast(hit.point, 0.3307159f, reflectDir, 100, 1 << 9 | 1<<10);

        //Draw lines beetween origin, hit.point and secondhit point.
        linerender.SetPosition(0, origin);
        linerender.SetPosition(1, hit.point);
        linerender.SetPosition(2, SecondHit.point);

    }
 //Create 50 balls when mouse clicked.
    if (Input.GetMouseButtonUp(0))
    {
        ShootDirected = true;
        StartCoroutine("BallCreate");
    }
 }

 IEnumerator BallCreate()
    {  
    Vector3 shootDirection = new Vector3(0,0,0);

    //Create 50 balls
    for (int i = 0; i < 50; i++)
    {

        Transform ball = Instantiate(BallPrefab, transform.position, Quaternion.identity) as Transform;
        Rigidbody2D rb = ball.GetComponent<Rigidbody2D>();

        if (ShootDirected)
        {
            //Set shootDirection to mouse position
            shootDirection = Input.mousePosition;
            shootDirection.z = 0.0f;
            shootDirection = Camera.main.ScreenToWorldPoint(shootDirection);

            //Get direction.
            shootDirection = (shootDirection - transform.position);
                ShootDirected = false;
        }
        //Apply force to each ball thru mouse direction.
        rb.velocity = new Vector2(shootDirection.x, shootDirection.y);
        rb.velocity = 7f * (rb.velocity.normalized);

        yield return new WaitForSeconds(0.08f);

    }
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
public-Transform-ballpreaf=null;
bool=true;
矢量鼠标3;
私有linerender linerender;
RAYCASTHITX;
专用矢量3-dir;
私人矢量源;
void Start()
{
linerender=GetComponent();
}
无效更新()
{
mousePos=newvector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x,Camera.main.ScreenToWorldPoint(Input.mousePosition).y,0);
//方向根据鼠标位置。
dir=鼠标点-transform.position;
原点=变换位置;
//第一个命中点0.3307159f是球的半径。

RaycastHit2D hit=Physics2D.CircleCast(origin,0.3307159f,dir,100f,1在Unity Technologies上的MelvMay帮助下发现了问题

简单地改变

`RaycastHit2D SecondHit = Physics2D.CircleCast(hit.point, 0.3307159f, reflectDir, 100, 1 << 9 | 1<<10);`

`RaycastHit2D SecondHit=Physics2D.CircleCast(hit.point,0.3307159f,reflectDir,100,1在Unity Technologies上的MelvMay帮助下发现了问题

简单地改变

`RaycastHit2D SecondHit = Physics2D.CircleCast(hit.point, 0.3307159f, reflectDir, 100, 1 << 9 | 1<<10);`

`RaycastHit2D SecondHit=Physics2D.CircleCast(hit.point,0.3307159f,reflectDir,100,1还更改linerender.SetPosition(0,原点);linerender.SetPosition(1,hit.centroid);linerender.SetPosition(2,SecondHit.centroid);还更改linerender.SetPosition(0,原点);linerender.SetPosition(1,命中.质心);linerender.SetPosition(2,第二次命中.质心);