C# 当我从地面拾取一个对象时,我的脚本会执行一些意想不到的操作

C# 当我从地面拾取一个对象时,我的脚本会执行一些意想不到的操作,c#,unity3d,unity5,mouse-picking,C#,Unity3d,Unity5,Mouse Picking,我目前正在编写一个脚本,可以拾取一个项目,然后单击鼠标左键将其删除。我还计划在我做这些动作时,额外旋转一个项目和一些图标 我目前对这一点还很陌生,所以我可能会把自己推向深渊。但是我想试试 这是我的密码: public class PickUp : MonoBehaviour { public Transform onHand; // Use this for initialization void Start () { } // Update is called once per fra

我目前正在编写一个脚本,可以拾取一个项目,然后单击鼠标左键将其删除。我还计划在我做这些动作时,额外旋转一个项目和一些图标

我目前对这一点还很陌生,所以我可能会把自己推向深渊。但是我想试试

这是我的密码:

public class PickUp : MonoBehaviour {

public Transform onHand;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    if(Input.GetMouseButton(1)){
        this.transform.position = onHand.position;
    }
}

void OnMouseDown () {



    GetComponent<Rigidbody>().useGravity = false;
    this.transform.position = onHand.position;
    this.transform.parent = GameObject.Find("Player").transform;
}

void OnMouseUp () {
    this.transform.parent = null;
    GetComponent<Rigidbody>().useGravity = true;
}
公共类接送:单一行为{
现有的公共改革;
//用于初始化
无效开始(){
}
//每帧调用一次更新
无效更新(){
if(输入。GetMouseButton(1)){
this.transform.position=onHand.position;
}
}
void OnMouseDown(){
GetComponent().useGravity=false;
this.transform.position=onHand.position;
this.transform.parent=GameObject.Find(“Player”).transform;
}
void OnMouseUp(){
this.transform.parent=null;
GetComponent().useGravity=true;
}
}


到目前为止,它还挺管用的。。我捡起我的东西有点困难,它不总是让我这么做。我必须点击几次,在它真正抓住物体之前。当它飞起来的时候,物体开始向上飞去,原因我不明白。我仍然可以握住它,我仍然可以拿着它四处走动,一旦我放开它,它就会掉下来。

根据您显示的有限数据,我可以建议一些常见的检查/尝试方法。如果你更新更多的细节,我会尽力帮助你进一步

为公共Transform现有变量指定了什么值

您在两个地方进行点击检测有什么原因吗?尝试删除“Update”方法中的行

OnMouseDown方法应该足够了。然而,为了让OnMouseDown工作,您的对象需要有一个物理碰撞器设置。检查是否有对撞机,其尺寸是否符合预期

出于调试目的,请尝试将皮卡的刚体上的“IsKinetic”设置为true(从inspector中,永久性地),这将禁用移动皮卡对象的重力和其他力,以便测试其余代码

此外,拾取它时,将其变换位置设置为0,0,0 这将使对象在播放器对象的确切中心点跟随播放器

一旦您确认此功能正常工作,请将功能放回并查看是否有任何功能破坏了设置

首先将位置从0,0,0设置回onHand,然后检查拾音器是否确实出现在玩家的手上。 如果没有,请检查现有变量的值

然后你可以关掉iSkynamic,看看是否一切正常

作为旁注: 您可能希望继续使用IsKinetic,而不是禁用重力。当拾取时,可以将其设置为运动学,以阻止任何力影响拾取的位置,而拾取本身仍会对其他刚体产生影响。
然后,当你把它放在鼠标上时,只需再次关闭iskinetic

onHand变量保存一个游戏对象,即对象将被放置的位置。是的,当我使用运动学时,它会停止向上流动,但问题是当我把它放下时:它会穿过地板的一半。你试过我描述的所有选项了吗?用如此有限的信息调试项目是很困难的。它穿过地板一半的事实可能是由于多种原因造成的。我需要看看当你“放下”它时对象在哪里,它的碰撞器是如何设置的,地板的碰撞器是如何设置的,是否有任何额外的代码处理它们的位置或碰撞器设置,如果你通过编辑器将它移回地板上方,当你释放它时它是否仍然会掉下来。等