2017-07-26 20 views
0

我試圖重新使用 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; 
     } 
    } 
} 

回答

1

的一種方法是簡單地增加被傳當偏移玩家的位置,但你將無法達到預期的平穩過渡。

我以爲會是一個公共布爾變量添加到發送者腳本(我假設發件人腳本是所有門戶網站),以虛假的默認值的另一種方法。 當你傳送時,你使用接收傳送器的位置將玩家的位置設置到新的位置。因爲您可以訪問接收傳送器GameObject,所以可以使用GetComponent獲取發送器腳本。在傳送玩家之前,您可以將此布爾變量設置爲true。 一旦玩家被傳時,OnTriggerEnter方法自動調用,這是你的問題。你可以在OnTriggerEnter中放入一個if語句,這樣當它被激活時,它只會傳送如果布爾變量爲假的。因爲當玩家傳送時是這樣,所以在離開門戶觸發器之前不允許傳送回來,然後可以將布爾變量設置爲false。這意味着通過門戶的正常行爲不受影響,因爲默認布爾值爲false。

此外,該代碼可能會更好,如果你在OnTriggerEnter,而不是更新了您的實際隱形傳態,如苦艾酒說。

希望這會有所幫助!

+0

非常感謝,我會嘗試這種方式,但看起來這是我需要的! – Rumata

1

我不知道你與你原來的代碼(沒有雙關語意)會和我沒有通過視頻(TLDR),但觀看你需要從頭開始重新考慮這一點。使用Update方法是完全不合適的;每幀更新火焰 - 你想傳送每一幀?

而是使用OnTriggerEnter方法:你可以這樣做

void OnTriggerEnter(Collider other) 
{ 
    other.transform.position = theVectorYouWantToTeleportTo 
} 
+0

謝謝,問題是我試圖實現無縫過渡,當用戶在第二個場景中看到來自第二個攝像頭的渲染圖像時,並且在下一個瞬間他傳送到第二個場景中的相同位置時,所以看起來他就像穿過門一樣穿過門戶。問題在於,在這種情況下,用戶將出現在第二個門戶中的對撞機中間,這也將使用OnTriggerEnter方法將玩家傳回。這樣玩家永遠不會穿過門戶。 – Rumata

+0

你可以在播放器上,傳送點或者一些全局對象設置「teleportedAlready」布爾變量來阻止玩家正被傳回來的時候了。如果你想讓第二個傳送的物品重新使用,你可以在一段時間後使用協程重置變量。 – Absinthe

+0

謝謝,這也是一個有趣的選項!但是在這種情況下,如果玩家在觸摸其觸發器的同時會在門戶附近停留一段時間,則在協程時間結束後他將再次傳回。 – Rumata