为什么传送不起作用?

时间:2017-07-26 20:14:22

标签: c# unity3d

我尝试使用重新创建门户网站场景 this视频。场景资产和脚本的链接位于视频下。

我面临传送问题

玩家应该通过门户中的平面触发器移动到第二个门户的位置。但在我看来,在传送后,他出现在第二个门户的平面触发器中间。如果他继续移动,他会跳回第一个门户网站,然后又回到第二个门户网站,依此类推。

为什么会发生这种情况?如何解决?据我了解剧本的作者,它应该在通过触发器之后传送播放器,但脚本对我来说并不像那样。

这是传送的脚本:

using UnityEngine;
using System.Collections;

public class Sender : MonoBehaviour {

    public GameObject player;
    public GameObject receiver;

    private float prevDot = 0;
    private bool playerOverlapping = false;

    void Start () {
    }

    void Update()
    {
        if (playerOverlapping) {
            var currentDot = Vector3.Dot(transform.up, player.transform.position - transform.position);

            if (currentDot < 10) // only transport the player once he's moved across plane
            {
                // transport him to the equivalent position in the other portal
                float rotDiff = -Quaternion.Angle(transform.rotation, receiver.transform.rotation);
                rotDiff += 180;
                player.transform.Rotate(Vector3.up, rotDiff);

                Vector3 positionOffset = player.transform.position - transform.position;
                positionOffset = Quaternion.Euler(0, rotDiff, 0) * positionOffset;
                var newPosition = receiver.transform.position + positionOffset;
                player.transform.position = newPosition;

                playerOverlapping = false;
            }

            prevDot = currentDot;
        }
    }


    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            playerOverlapping = true;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.tag == "Player")
        {
            playerOverlapping = false;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我不知道你的原始代码在哪里(没有双关语意)我没有通过视频观看(TLDR),但你需要重新考虑这一点从头开始。使用Update方法是完全不合适的;每帧更新一次 - 你想传送每一帧吗?

而是使用OnTriggerEnter方法:

{{1}}

答案 1 :(得分:1)

你可以这样做的一种方法是简单地增加传送时玩家位置的偏移量,但是你将无法实现所需的平滑过渡。

我想到的另一种方法是将一个公共布尔变量添加到Sender脚本(我假设发件人脚本在所有门户上),默认值为false。 当你传送时,你可以使用接收传送器的位置将玩家的位置设置到新位置。因为您可以访问接收远程传送器GameObject,所以您可以使用GetComponent来获取它的Sender脚本。然后,您可以在传送播放器之前将此布尔变量设置为true。 一旦传送了播放器,就会自动调用OnTriggerEnter方法,这是你的问题。你可以在OnTriggerEnter中放置一个if语句,这样当它被激活时,它只会传送一个布尔变量为false的传送。因为当玩家传送时它是真的,所以在你离开门户触发器之前不允许传送回来,然后你可以将布尔变量设置回假。这意味着在门户网站中行走的正常行为不受影响,因为默认的布尔值为false。

另外,如果您在OnTriggerEnter而不是Update中进行实际的远程传送,这段代码可能会好得多,正如Absinthe所说。

希望这有帮助!