我正在构建一个化学游戏,用户可以拖动不同的原子并将它们连接在一起构建分子。我能够将原子带到"坚持"当他们碰撞时彼此相对。但是,球体只是粘在彼此的外面。我想让它们略微重叠,如下图所示。
基本上,我希望用户单击并拖动鼠标以在其他原子球体的半径内拖动原子球体。当碰撞发生时,我希望原子被吸得"吸吮"进入另一个原子。然而,我面临的问题是,因为用户使用鼠标握住原子,所以任何类型的移动都被否定。我已经尝试了以下三行代码中的每一行,但是当用户握住鼠标时,它们都没有能够让那个原子吸入另一个原子。
atom_entering.transform.position = Vector3.MoveTowards(atom_entering.transform.position, this_atom.transform.position, 5*Time.deltaTime);
atom_entering.GetComponent<Rigidbody>().MovePosition(this_atom.transform.position + (atom_entering.transform.position - this_atom.transform.position));
atom_entering.GetComponent<Rigidbody>().AddForce(this_atom.transform.position, ForceMode.Acceleration);
如果我尝试减小每个原子的半径,它可以工作,但原子开始剪切任何其他碰撞,如表本身。
编辑:要求发布完整代码:
void OnCollisionEnter(Collision collision)
{
GameObject atom_entering = collision.gameObject;
GameObject this_atom = this.gameObject;
if(atom_entering.name == "HydrogenPrefab(Clone)" && num_hydrogens < max_hydrogens && !hydrogen_connected)
{
// Code to make the "suction" effect here
// One of the three lines above went here but none of them worked.
// First, make the hydrogen a child of this oxygen atom.
// Next, create a Fixed Joint component on the hydrogen and stick it to the oxygen
atom_entering.transform.parent = this_atom.transform;
atom_entering.AddComponent<FixedJoint>();
atom_entering.GetComponent<FixedJoint>().connectedBody = this_atom.GetComponent<Rigidbody>();
atom_entering.GetComponent<HydrogenCollider>().setConnectedStatus(true);
// Increment the number of hydrogens connected to the oxygen
num_hydrogens += 1;
}
}
在单独的C#脚本中:
void OnMouseDrag()
{
this.GetComponent<Rigidbody>().isKinematic = true;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, Camera.main.farClipPlane))
{
float oldY = this.transform.position.y;
this.transform.position = new Vector3(hit.point.x, oldY, hit.point.z);
}
this.GetComponent<Rigidbody>().isKinematic = false;
}
编辑:这是一个关于它当前表现如何的视频。 https://vimeo.com/185896832
我希望同样的行为期望我只想得到它&#34;吸入&#34;父原子。如果我对半径做任何事情,原子会沉入地板,这不是我想要的。当一个物体与地板相互作用时具有正常半径并且当它与原子相互作用时具有不同的半径是没有意义的。
答案 0 :(得分:0)
这就是我要做的事情:
我会使用空 GameObjects 创建我的 atoms 的预制件作为参考的子项(例如:OxygenAtom =&gt; HydrogenPos1,HydrogenPos2,HydrogenPos3和HydrogenPos4)
在原子上我会有一个脚本来管理可用位置和被占用的位置
当您携带的原子(让 Atom2 )与另一个原子( Atom1 )发生碰撞时,请检查可用的原子适合 Atom2 类型的位置。
如果匹配,则将可用位置标记为已占用,将父 Atom2 标记为 Atom1 的子项,最后将其置于您刚检查为占用的位置
编辑:这里是将原子绑定在一起的代码示例:
protected void OnCollisionEnter(Collision collision)
{
if(gameObject.name.Equals("Oxygen") && collision.gameObject.name.Equals("Hydrogen"))
{
Debug.Log("Binding...");
StartCoroutine(BindAtomAfterFixedUpdate(collision.gameObject));
}
}
private IEnumerator BindAtomAfterFixedUpdate(GameObject atomToBind)
{
GetComponent<SphereCollider>().isTrigger = true;
// or GetComponent<SphereCollider>().enabled = false;
yield return new WaitForFixedUpdate();
atomToBind.transform.position = transform.FindChild("HydrogenSpot").position;
gameObject.AddComponent<FixedJoint>().connectedBody = atomToBind.GetComponent<Rigidbody>();
GetComponent<SphereCollider>().isTrigger = false;
// or GetComponent<SphereCollider>().enabled = true;
}