Unity transform.position无法正常工作

时间:2018-05-23 13:22:38

标签: c# unity3d

好的,所以我想出了我遇到的问题。为门户网站返回的位置是在门户网站内部,当一个对象在另一个对象内部时它会出现故障,所以我只是在门户网站上添加了一个空对象,我希望它们退出并让程序指向该对象。 /强>

我正在Unity中开展一个小小的“游戏”,标有四个门户网站PortalMain1PortalMain2PortalMain3PortalMain4,目标是让玩家能够在门户网站的每一个上撞上对撞机并随机地传送到其他门户网站之一。

我在处理触发事件的播放器模型上有这段代码:

private void OnTriggerEnter(Collider other)
{
    int PortalDestination = Random.Range(1, 4);  ///Portals index at 1 because Unity
    string Portal = "PortalMain" + PortalDestination;
    Debug.Log(Portal);
    transform.position = GameObject.Find(Portal).transform.position;
}

游戏中实际发生的事情是,当玩家与门户上的盒子对撞机发生碰撞时,游戏将从1-4中正确选择一个门户(尽管,似乎永远不会选择你触摸的那个整齐的门户)和传送你在那里。

除了你在门户附近传送而不是在它之上传送,并且如果传送确实有效,它似乎只能工作大约1/4的时间。

以下是基础场景层次结构的图片:

scene with the base

以下是建筑物场景层次结构的图片:

scene with the building

以下是门户网站场景层次结构的图片:

scene with the portal

编辑#1:我重新设计了使用Rigidbody的方法,但问题仍然存在。

private void OnTriggerEnter(Collider other)
{
    int PortalDestination = Random.Range(1, 4);  ///Portals index at 1 because Unity
    string Portal = "PortalMain" + PortalDestination;
    Debug.Log(Portal);
    GetComponent<Rigidbody>().isKinematic = true;
    GetComponent<Rigidbody>().position = GameObject.Find(Portal).transform.position;
    GetComponent<Rigidbody>().isKinematic = false;
} 

这是Github链接&gt; https://github.com/LvInSaNevL/Bamboozle

1 个答案:

答案 0 :(得分:0)

首先,将OnTriggerEnter附加到TRIGGER,而不是播放器。

第二,在门户网站上附加此脚本并明确设置spawnPoint。

之后,您可以将该门户网站复制到任何您想要的位置,并将其自身添加到可供玩家退出的可能门户列表中。

public class Portal : MonoBehaviour {
    public static List<Portal> portals {get; protected set;}
    public Transform spawnPoint; // Set it in the editor
    protected bool ignoreNextTouches = false;

    private void Start () {
        if (portals == null)
            portals = new List<Portal>();
        portals.Add (this);
    }
    private void OnTriggerEnter (Collider other) {
        if (!other.gameObject.tag.Equals ("Player"))
            return;
        if (ignoreNextTouches) {
            ignoreNextTouches = false;
            return;
        }
        Portal random = GetRandomPortal (this);
        random.ignoreNextTouches = true;
        other.transform.position = random.spawnPoint.position;
    }
    private static Portal GetRandomPortal (Portal exceptThis) {
        Portal  p = exceptThis;
        while (p == exceptThis)
            p = portals[Random.Range(0,portals.Length)];
        return p;
    }
}