2015-11-15 46 views
1

我在玩家總是彈跳上下的遊戲中創建可以在不同高度的不同地面上玩的遊戲。 我創造了這個代碼彈跳:彈跳(通過代碼而不是物理材質)並改變高度

transform.position = new Vector3(Mathf.Lerp(transform.position.x, Towards.x, Time.deltaTime * 5), minY + Mathf.Abs(Mathf.Sin(Time.time * 3) * maxY) , transform.position.z); 

與「美星」我CONTROLL在彈跳高度的量。我改變美星時,球在地面上,因此將有一個平穩的運動

 if (Mathf.Abs(Mathf.Sin(Time.time * 3)) < 0.02f && grounded) 
     { 
      grounded = false; 
      maxZ = 2.5f * maxY; 
     } 
     else if (Mathf.Abs(Mathf.Sin(Time.time * 3)) > 0.02f) 
     { 
      grounded = true; 
     } 

我的問題是,當球進入到一個更高或更低的地面。

我檢測地面HIGHT與此代碼:

  RaycastHit hit; 
     if (Physics.Raycast(transform.position, -transform.up, out hit, 40, mask)) 
     { 
      minY = GetComponent<SphereCollider>().radius + hit.point.y; 
     } 

,然後它會在下次更新被添加到MINY。但問題在於,當minY發生變化時,玩家會突然改變其在空中的位置。

我需要一個代碼來使這個高度變化平滑,但不能提出任何想法。

+0

(MINY,持有人,Time.deltaTime * 2),但它仍然從一個跳躍身高突然到另一個 –

+0

等一下,'minY'是什麼?一個變量?一個東西? –

+0

minY是gameObject可以達到的最小高度。因爲「Mathf.Sin(Time.time * 3)」介於[0,1]之間,所以我將它添加到高度,以便最小高度可以更高。 –

回答

1

這是我非常簡單的解決方案,也許你可以給它一個嘗試:通過我曾嘗試Mathf.Lerp方式

using UnityEngine; 
using System.Collections; 

public class jump : MonoBehaviour { 

    private float radius; 
    public float jumpPowa = 350; 
    // Use this for initialization 
    void Start() { 
     radius = GetComponent<Collider>().bounds.extents.y; 
    } 

    // Update is called once per frame 
    void Update() { 
     if (isGrounded()) 
     { 
      GetComponent<Rigidbody>().AddForce(transform.up * jumpPowa); 
     } 
    } 

    private bool isGrounded() 
    { 
     return Physics.Raycast(transform.position, -Vector3.up, radius + 0, 1); 
    } 
} 
+0

恩,謝謝你,先生!你反覆使用增加的力量是正確的比使用lerp好多了。 –

+0

啊,順便說一句,如果更新調用太快,也許它可以多次添加該力。你也應該檢查一下。可能你會發現有時它會跳到比正常高的位置,這就是爲什麼。我希望我能解釋我的意思。 –