gpt4 book ai didi

c# - 碰撞后正确附加到游戏对象?

转载 作者:太空狗 更新时间:2023-10-29 20:36:14 25 4
gpt4 key购买 nike

我怎样才能正确地使一个游戏对象在碰撞后附加(或“粘附”)到另一个游戏对象上?问题:我希望 GameObject 在碰撞后附加,即使它正在改变比例。

“附加碰撞”代码:

protected Transform stuckTo = null;
protected Vector3 offset = Vector3.zero;

public void LateUpdate()
{
if (stuckTo != null)
transform.position = stuckTo.position - offset;
}

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

if(stuckTo == null
|| stuckTo != col.gameObject.transform)
offset = col.gameObject.transform.position - transform.position;

stuckTo = col.gameObject.transform;
}

此代码使 GameObject 在碰撞后完美附着。但是当那个 GameObject 改变比例时(当它被附加时),它在视觉上看起来不再依附于它所碰撞的任何东西。基本上,此代码使 GameObject 在碰撞时仅保持原始比例。我怎样才能让 GameObject 始终坚持它所碰撞的任何东西?在这个过程中它有什么规模?我想避免育儿:“虽然这有点不安全,育儿碰撞器会导致奇怪的结果,比如随机传送或物体开始疯狂移动和旋转等。” - Samed Tarık ÇETİN : comment .

缩放脚本:

public Transform object1; //this is the object that my future-scaling GameObject collided with.
public Transform object2; //another object, the same scale as object1, somewhere else
//(or vice versa)

void Update ()
{
float distance = Vector3.Distance (object1.position, object2.position);
float original_width = 10;
if (distance <= 10)
{
float scale_x = distance / original_width;
scale_x = Mathf.Min (scale_x, 3.0f);
transform.localScale = new Vector3 (scale_x * 3.0f, 3.0f / scale_x, 3.0f);
}
}

最佳答案

您的基本想法是正确的,您的代码可以稍微修改以支持这一点。

诀窍是:不是将您的对象粘到与其碰撞的对象上,而是创建一个虚拟游戏对象,我们称之为“胶水”,在碰撞点,并将您的对象粘到胶水上。然后,胶水对象成为我们与之发生碰撞的对象的父级。

由于 glue 只是一个只有组件转换和一些脚本的虚拟对象,所以父子关系没有问题。

另外,请注意,如果我们有多个接触点,我们在哪个接触点创建胶水并不重要,而且扩展它以支持旋转也很容易,请参见下文。

所以在碰撞时,我们现在唯一要做的就是创建胶水。这是代码:

void CreateGlue(Vector3 position, GameObject other) {
// Here we create a glue object programatically, but you can make a prefab if you want.
// Glue object is a simple transform with Glue.cs script attached.
var glue = (new GameObject("glue")).AddComponent<Glue>();

// We set glue position at the contact point
glue.transform.position = position;

// This also enables us to support object rotation. We initially set glue rotation to the same value
// as our game object rotation. If you don't want rotation - simply remove this.
glue.transform.rotation = transform.rotation;

// We make the object we collided with a parent of glue object
glue.transform.SetParent(other.transform);

// And now we call glue initialization
glue.AttachObject(gameObject);
}

void OnCollisionEnter(Collision col)
{
// On collision we simply create a glue object at any contact point.
CreateGlue(col.contacts[0].point, col.gameObject);
}

这是 Glue.cs 脚本的样子,它将处理 LateUpdate 和修改转换。

public class Glue : MonoBehaviour {

protected Transform stuckTo = null;
protected Vector3 offset = Vector3.zero;

public void AttachObject(GameObject other)
{
// Basically - same code as yours with slight modifications

// Make rigidbody Kinematic
var rb = other.GetComponent<Rigidbody>();
rb.isKinematic = true;

// Calculate offset - pay attention the direction of the offset is now reverse
// since we attach glue to object and not object to glue. It can be modified to work
// the other way, it just seems more reasonable to set all "glueing" functionality
// at Glue object
offset = transform.position - other.transform.position;

stuckTo = other.transform;
}

public void LateUpdate()
{
if (stuckTo != null) {
// If you don't want to support rotation remove this line
stuckTo.rotation = transform.rotation;

stuckTo.position = transform.position - transform.rotation * offset;
}
}

// Just visualizing the glue point, remove if not needed
void OnDrawGizmos() {
Gizmos.color = Color.cyan;
Gizmos.DrawSphere(transform.position, 0.2f);
}
}

此外,请注意,按照此处的建议简单地设置对象的父级会给您带来一些额外的麻烦,因为缩放父级也会缩放子级,因此您必须将子级重新缩放回其原始大小。问题是这些缩放操作是相对于不同的 anchor 的,因此您还必须对对象位置进行额外的调整。虽然可以做到。

我还创建了一个小示例项目,请参见此处(Unity v5.2.f3): https://www.dropbox.com/s/whr85cmdp1tv7tv/GlueObjects.zip?dl=0

附言我看到你混合了变换和刚体语义,因为它是在运动学刚体上完成的,所以这没什么大不了的,只是一个建议:想想你是否真的需要在已经“粘”到其他物体上的物体上设置刚体,如果不需要的话- 也许只是移除或禁用刚体而不是使其成为运动学的。

关于c# - 碰撞后正确附加到游戏对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33845963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com