Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
C# &引用;棍子;碰撞后游戏对象到另一个游戏对象?_C#_Unity3d_Unity5 - Fatal编程技术网

C# &引用;棍子;碰撞后游戏对象到另一个游戏对象?

C# &引用;棍子;碰撞后游戏对象到另一个游戏对象?,c#,unity3d,unity5,C#,Unity3d,Unity5,目前,我正在使用以下代码使对象粘到其他游戏对象上: void OnCollisionEnter(Collision col) { rb = GetComponent<Rigidbody>(); rb.isKinematic = true; gameObject.transform.SetParent (col.gameObject.transform); } void OnCollisionEnter(冲突列) { rb=GetComponent(); rb

目前,我正在使用以下代码使对象粘到其他游戏对象上:

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;
    gameObject.transform.SetParent (col.gameObject.transform);
}
void OnCollisionEnter(冲突列)
{
rb=GetComponent();
rb.iskinetic=true;
gameObject.transform.SetParent(col.gameObject.transform);
}
它工作得很好,但它会导致许多其他问题。例如,碰撞后,它无法再检测碰撞


是否有人拥有此代码的替代方案(这会使游戏对象在碰撞后粘在另一个上)?

这是一个开始,请注意,这不考虑旋转,我相信你会明白的,对吧?;)

protectedtransform stuckTo=null;
受保护矢量3偏移=矢量3.0;
公共更新()
{
if(stuckTo!=null)
transform.position=stuckTo.position-偏移;
}
无效碰撞中心(碰撞柱)
{
rb=GetComponent();
rb.iskinetic=true;
如果(stuckTo==null
||stuckTo!=col.gameObject.transform)
偏移量=col.gameObject.transform.position-transform.position;
stuckTo=col.gameObject.transform;
}
编辑:正如承诺的那样,这里有一个更高级的版本,考虑到了轮换:

Transform stuckTo;
Quaternion offset;
Quaternion look;
float distance;

public void LateUpdate()
{
    if (stuckTo != null)
    {
        Vector3 dir = offset * stuckTo.forward;
        transform.position = stuckTo.position - (dir * distance);
        transform.rotation = stuckTo.rotation * look;
    }
}

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;

    if(stuckTo == null 
        || stuckTo != col.gameObject.transform)
    {
        Vector3 diff = col.gameObject.transform.position - transform.position;
        offset = Quaternion.FromToRotation (col.gameObject.transform.forward, diff.normalized);
        look = Quaternion.FromToRotation (col.gameObject.transform.forward, transform.forward);
        distance = diff.magnitude;
        stuckTo = col.gameObject.transform;
    }
}
转换stuckTo;
四元数偏移;
四元数外观;
浮动距离;
公共更新()
{
if(stuckTo!=null)
{
Vector3 dir=偏移量*stuckTo.forward;
transform.position=stuckTo.position-(方向*距离);
transform.rotation=stuckTo.rotation*外观;
}
}
无效碰撞中心(碰撞柱)
{
rb=GetComponent();
rb.iskinetic=true;
如果(stuckTo==null
||stuckTo!=col.gameObject.transform)
{
Vector3 diff=col.gameObject.transform.position-transform.position;
偏移=四元数.FromToRotation(col.gameObject.transform.forward,diff.normalized);
look=Quaternion.FromToRotation(col.gameObject.transform.forward,transform.forward);
距离=差异大小;
stuckTo=col.gameObject.transform;
}
}

I get
error CS0019:运算符“-”不能应用于第行
offset=col.gameObject.Transform-Transform.position上的“UnityEngine.Transform”和“UnityEngine.Vector3”类型的操作数我想你需要检查你的代码,因为当我运行游戏时,游戏对象就消失了。这是因为LateUpdate()方法:
public void LateUpdate(){if(stuckTo!=null)transform.position=stuckTo.position+offset;}
Write
Debug.Log(transform.position)
转换为
transform.position=stuckTo.position+offset之后的
if
语句行,并告诉我它说什么
Transform stuckTo;
Quaternion offset;
Quaternion look;
float distance;

public void LateUpdate()
{
    if (stuckTo != null)
    {
        Vector3 dir = offset * stuckTo.forward;
        transform.position = stuckTo.position - (dir * distance);
        transform.rotation = stuckTo.rotation * look;
    }
}

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;

    if(stuckTo == null 
        || stuckTo != col.gameObject.transform)
    {
        Vector3 diff = col.gameObject.transform.position - transform.position;
        offset = Quaternion.FromToRotation (col.gameObject.transform.forward, diff.normalized);
        look = Quaternion.FromToRotation (col.gameObject.transform.forward, transform.forward);
        distance = diff.magnitude;
        stuckTo = col.gameObject.transform;
    }
}