2013-03-26 115 views
5

我正在Unity編寫2D平臺遊戲,我試圖讓玩家留在移動平臺上。我已經完成了一兩天的搜索和修補工作,而且我沒有任何運氣。留在移動平臺上

基本上,我被告知要儘量讓角色在觸摸時隨着平臺移動。首先,如果我使用與OnTriggerEnter()相關的任何東西,玩家就可以通過該平臺。如果我做OnCollisionEnter()(在播放器上有一個CharacterController,在平臺上有一個BoxCollider),根本沒有任何事情發生。這些是我發現的最重要的兩件事。另一個是用平臺來撫養玩家,但這顯然會造成「問題」(經常說,從來沒有解釋過)。

那麼,我該如何讓玩家留在移動平臺上呢?下面是移動平臺的代碼:

public class MovingPlatform : MonoBehaviour 
{ 
private float useSpeed; 
public float directionSpeed = 9.0f; 
float origY; 
public float distance = 10.0f; 

// Use this for initialization 
void Start() 
{ 
    origY = transform.position.y; 
    useSpeed = -directionSpeed; 
} 

// Update is called once per frame 
void Update() 
{ 
    if(origY - transform.position.y > distance) 
    { 
     useSpeed = directionSpeed; //flip direction 
    } 
    else if(origY - transform.position.y < -distance) 
    { 
     useSpeed = -directionSpeed; //flip direction 
    } 
    transform.Translate(0,useSpeed*Time.deltaTime,0); 
} 

,這裏是對玩家的動作(在更新)的代碼:與我怎麼樣,我認爲它可能要做:

CharacterController controller = GetComponent<CharacterController>(); 
    float rotation = Input.GetAxis("Horizontal"); 
    if(controller.isGrounded) 
    { 
     moveDirection.Set(rotation, 0, 0); //moveDirection = new Vector3(rotation, 0, 0); 
     moveDirection = transform.TransformDirection(moveDirection); 

     //running code 
     if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) //check if shift is held 
     { running = true; } 
     else 
     { running = false; } 

     moveDirection *= running ? runningSpeed : walkingSpeed; //set speed 

     //jump code 
     if(Input.GetButtonDown("Jump")) 
     { 
      //moveDirection.y = jumpHeight; 
      jump(); 
     } 
    } 
    moveDirection.y -= gravity * Time.deltaTime; 
    controller.Move(moveDirection * Time.deltaTime); 

編輯m定義了玩家和平臺,但我嘗試了不同的組合。如果平臺是一個觸發器(在其對撞機上),玩家就會一直貫徹它。如果沒有,我不能使用OnTrigger函數。我有一個固定在播放器和平臺上的剛體,但它似乎沒有影響任何東西。當玩家在某些設置上進入平臺時,他會不停地跳動,而且往往會結束。

+0

我從來沒有使用Unity3D,但有可能像做'moveDirection + = theplatform。moveDirection'當角色在平臺上? – mbeckish 2013-03-26 17:59:05

+0

我試過了,但我似乎遇到了OnTrigger和OnCollision函數的問題,這些函數將負責「玩家在平臺上」時的情況。我認爲這與我如何定義我的對象有關,但我不確定如何定義它們以使其可行。 – muttley91 2013-03-26 18:02:02

+0

此外,你需要確保角色的moveDirection.y永遠不會比你的平臺的moveDirection.y更少,否則你會遇到(除非Unity3D框架自動爲你處理?) – mbeckish 2013-03-26 18:03:10

回答

1

你需要什麼似乎是平臺上的第二對撞機。主對撞機有isTrigger = false以確保你的角色控制器正在工作。第二個以isTrigger = true運行,其唯一功能是當OnTriggerEnter被調用時檢測到玩家是附着到平臺的類型,並且離開平臺OnTriggerExit。因爲你不能有2個相同類型的對撞機(我猜你需要箱子對撞機),所以在你的平臺遊戲對象下建立一個空的小孩,並指定箱子對撞機。我通常採用一種名爲ActionMaterial的特殊物理材料來讓我的東西變得乾淨。如果您使用圖層並調整了碰撞矩陣,請確保碰撞由physX處理。

+0

我可以在同一個物體上使用兩個不同的碰撞體(一個箱體,一個膠囊)來獲得同樣的效果,而不是使用兩個物體並讓它們都需要移動腳本? 另外,我沒有使用圖層,也沒有調整碰撞矩陣。 – muttley91 2013-03-26 21:50:59

+0

允許有不同的對撞機。但請記住,膠囊對撞機的價格要高得多。因此,如果有立方體形狀,最好使用子對象解決方案。沒有圖層,沒有碰撞矩陣操作=>沒有增加複雜性;)當你遇到性能問題時,你只需要那些東西。我正在爲iOS開發,所以對我來說性能始終是個問題 – Kay 2013-03-26 21:57:18

+0

啊,夠公平了!所以要清楚,你的意思是在場景中有兩個遊戲對象?你如何專門製造一個物體成爲另一個物體的孩子? – muttley91 2013-03-26 22:16:10

1

這不是最好的方法,但是你可以從播放器到移動平臺執行RayCast。如果RayCast點擊「MovingPlatform」,您可以檢查Y軸上的差異來確定播放器是否足夠接近它被視爲「OnThePlatform」。然後你可以像平常一樣調整玩家位置。

一個例子是:

private bool isOnMovingPlatform; 
private float offsetToKeepPlayerAbovePlatform = 2.2f; 
private float min = 0.2f; 
private float max = 1.2f; 

private void Update() 
{ 
RaycastHit hit; 
if(Physics.Raycast (player.position, player.TransformDirection(Vector3.down), out hit)) 
{ 
    if(hit.transform.name.Contains("MovingPlatform")) 
    { 
     Transform movingPlatform = hit.collider.transform; 

     if(movingPlatform.position.y - player.position.y <= min && movingPlatform.position.y - player.position.y >= max) 
     { 
      isOnMovingPlatform = true; 
     } 
     else 
     { 
      isOnMovingPlatform = false; 
     } 
    } 

    if(isOnMovingPlatform) 
    { 
     player.position = new Vector3(hit.transform.x, hit.transform.y + offsetToKeepPlayerAbovePlatform, 0); 
    } 
} 
} 
+0

只是好奇心,因爲我即將嘗試這個,最小值,最大值和偏移量,它們是否與平臺的大小有關? – muttley91 2013-03-26 21:47:15

+0

不一定。最小和最大值只是範圍,因此您知道玩家與平臺相關的位置。例如,如果玩家的Y值高於最大值5,那麼顯然他不在平臺上,反之亦然。改變範圍,直到你得到一對漂亮的花車。理論上他們可能來自平臺的高度,但他們不必這樣做。 – 2013-03-26 22:05:07

0

This Unity Answers page可能會有所幫助。

+0

這確實很不錯。但是您應該將其作爲評論發佈或提供更多信息。僅包含鏈接的答案將在SO上被殺害(我剛剛輸了一些) – Kay 2013-03-27 16:14:15

0

你也可以簡單地讓玩家的遊戲對象變換父母,等於平臺的變換。這可以讓玩家在玩遊戲時保持移動。至於檢測Raycast是有點慢,但完成工作。