Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 使用光线投射拖动对象是错误的_Unity3d_Raycasting - Fatal编程技术网

Unity3d 使用光线投射拖动对象是错误的

Unity3d 使用光线投射拖动对象是错误的,unity3d,raycasting,Unity3d,Raycasting,当使用光线投射缓慢拖动对象时,对象移动会有一点滞后 当快速拖动对象时,鼠标指针脱离层光线投射的区域,因此对象不再移动 主项目是在平面上拖动立方体 但为了使项目更简单,我打开了一个新的2D项目,画了一个圆,并为其指定了以下脚本,并将球体碰撞器附加到该项目上(主要目标位于3D空间) //如果有人写: 私人矢量2 deltaPos; 无效更新(){ 矢量2触摸位置; 如果(Input.GetMouseButtonDown(0)){//单击目标 雷卡斯特击中; var-ray=Camera.main.s

当使用光线投射缓慢拖动对象时,对象移动会有一点滞后

当快速拖动对象时,鼠标指针脱离层光线投射的区域,因此对象不再移动

主项目是在平面上拖动立方体

但为了使项目更简单,我打开了一个新的2D项目,画了一个圆,并为其指定了以下脚本,并将球体碰撞器附加到该项目上(主要目标位于3D空间)

//如果有人写:
私人矢量2 deltaPos;
无效更新(){
矢量2触摸位置;
如果(Input.GetMouseButtonDown(0)){//单击目标
雷卡斯特击中;
var-ray=Camera.main.screenpointoray(Input.mousePosition);
if(Physics.Raycast(光线,命中率,数学无限)){
touchPos=新矢量3(点击点x,点击点y);
deltaPos.x=touchPos.x-transform.position.x;
deltaPos.y=touchposy-transform.position.y;
Log(“你点击了我”);
}
}
if(Input.GetMouseButton(0)){
雷卡斯特击中;
var-ray=Camera.main.screenpointoray(Input.mousePosition);
if(Physics.Raycast(光线,命中率,数学无限)){
transform.position=newvector2(hit.point.x-deltaPos.x,hit.point.y-deltaPos.y);
}
}
}
我希望能定期拖动球体,但当快速移动时,指针会离开球体碰撞器,因此圆圈停止移动


我发现了这一点,然后我将void从
Update()
更改为
FixedUpdate()
,但结果相同。

尝试将物理代码放入为物理计算而构建的
FixedUpdate()
函数中。然后,如果它是滞后的,您可以在物理设置中更改
固定时间步长

固定时间步长:一个独立于帧速率的间隔,指示何时执行物理计算和FixeUpdate()事件。

编辑 此代码:

if (Physics.Raycast (ray, out hit, Mathf.Infinity))
检查光线投射是否击中了某个物体,因此当指针离开球体时,没有其他物体可击中,因此如果条件返回false且您无法移动它,要解决此问题,请将一个大四边形或平面作为子对象添加到您的相机中,并确保它完全填充相机视图,它位于所有其他场景元素的后面

您还可以制作一个脚本,为您设置此平面

编辑2 作为解决此问题的另一种方法,您可以使用标志

将其添加到您的相机中,或根据您的需要进行编辑

公共类DragObjects:monobhavior
{
照相机这个照相机;
私有变换拖动对象;
bool DraggingFlag=false;
raycast-hit-raycast;
射线;
矢量三角定位;
void Start()
{
thisCamera=GetComponent();
}
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
ray=thisCamera.ScreenPointToRay(输入.鼠标位置);
if(物理光线投射(光线,外光线投射,数学无限))
{
DraggingObject=raycast.collider.transform;
DraggingFlag=true;
deltaPosition=thisCamera.ScreenToWorldPoint(Input.mousePosition)-DraggingObject.position;
}
}
else if(Input.GetMouseButton(0))
{
如果(拖动标志)
{
DraggingObject.position=新矢量3(thisCamera.ScreenToWorldPoint(Input.mousePosition).x-deltaPosition.x,thisCamera.ScreenToWorldPoint(Input.mousePosition).y-deltaPosition.y,DraggingObject.position.z);
}
}
else if(Input.GetMouseButtonUp(0))
{
DraggingFlag=false;
}
}
}
请记住在开始时在变量中兑现您的
Camera.main
,因为它没有性能,并且在后台执行此操作:
GameObject.FindGameObjectsWithTag(“MainCamera”).GetComponent()


尝试将物理代码放入为物理计算而构建的
FixedUpdate()
函数中。然后,如果它是滞后的,您可以在物理设置中更改
固定时间步长

固定时间步长:一个独立于帧速率的间隔,指示何时执行物理计算和FixeUpdate()事件。

编辑 此代码:

if (Physics.Raycast (ray, out hit, Mathf.Infinity))
检查光线投射是否击中了某个物体,因此当指针离开球体时,没有其他物体可击中,因此如果条件返回false且您无法移动它,要解决此问题,请将一个大四边形或平面作为子对象添加到您的相机中,并确保它完全填充相机视图,它位于所有其他场景元素的后面

您还可以制作一个脚本,为您设置此平面

编辑2 作为解决此问题的另一种方法,您可以使用标志

将其添加到您的相机中,或根据您的需要进行编辑

公共类DragObjects:monobhavior
{
照相机这个照相机;
私有变换拖动对象;
bool DraggingFlag=false;
raycast-hit-raycast;
射线;
矢量三角定位;
void Start()
{
thisCamera=GetComponent();
}
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
ray=thisCamera.ScreenPointToRay(输入.鼠标位置);
if(物理光线投射(光线,外光线投射,数学无限))
{
DraggingObject=raycast.collider.transform;
DraggingFlag=true;
deltaPosition=此