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 geterror CS0019:运算符“-”不能应用于第行offset=col.gameObject.Transform-Transform.position上的“UnityEngine.Transform”和“UnityEngine.Vector3”类型的操作数代码>我想你需要检查你的代码,因为当我运行游戏时,游戏对象就消失了。这是因为LateUpdate()方法:public void LateUpdate(){if(stuckTo!=null)transform.position=stuckTo.position+offset;}
WriteDebug.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;
}
}