2015-08-31 133 views
1

我使用的是統一性5.1.2,如果這有所作爲。將玩家對象圍繞玩家對象移動一個光滑的圓圈

我有一個遊戲對象的盾牌,我想圍繞一個球員圍繞一個圈子移動。我有一定程度的工作能力,盾牌對輸入有很好的響應,但不會動畫,因爲它只是傳送到新的位置,而不是在平滑的旋轉中繞着一圈移動。遊戲是2D自上而下,所以只能在x/y平面上工作。試圖使用lerp和slerp,但沒有得到任何喜悅

真的很感謝你的幫助,弄清楚這一個!

這是我到目前爲止有:

public class ShieldMovement : MonoBehaviour { 

    public Transform target; //player shield is attaced to 

    float distance = 0.8f; // distance from player so it doesn't clip 
    Vector3 direction = Vector3.up; 


    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 

     float angle = Mathf.Atan2 (Input.GetAxisRaw("rightH"), Input.GetAxisRaw("rightV"))* Mathf.Rad2Deg; 

     if(Input.GetAxis("rightH") != 0f || Input.GetAxis("rightV") != 0f) 
     { 
      direction = new Vector3(Input.GetAxis("rightH"),Input.GetAxis("rightV"), 0.0f) ; 
     } 

     Ray ray = new Ray(target.position, direction); 
     transform.position = ray.GetPoint(distance); 

     if(Input.GetAxis("rightH") != 0f || Input.GetAxis("rightV") != 0f) 
     { 
      transform.rotation = Quaternion.AngleAxis(angle,Vector3.forward*-1); 
     } 
    } 
} 
+0

你想讓'transform.position'平滑移動或'transform.rotation'嗎? –

+1

可能爲你節省一點代碼的東西是在空變換下父屏蔽,然後在播放器下面居中和父變換空變換。這樣,你不需要弄清盾的旋轉/位置,只需要旋轉它的父母。 (只是提供替代您當前的方法。) – Serlite

+0

@StevenMills transform.position。本質上,如果盾牌位於右下角,並且我將棍子直接移動到左上角,盾牌從左下角消失並立即出現在右上角,而不是平滑地繞着圓圈移動,直到到達新點。 –

回答

0

試試這個。通過對Input.GetAxis("...")進行如此多的方法調用,您真的只需要在開始時調用它一次,並將其緩存到變量中以加快速度。你也不需要兩次檢查if(Input.GetAxis("rightH") != 0f || Input.GetAxis("rightV") != 0f),所以我把所有東西都放到了其中一個檢查中。我加了一個乘以Time.smoothDeltaTime有希望出來打圓場你

float h = Input.GetAxis("rightH"); 
float v = Input.GetAxis("rightV"); 

float angle = Mathf.Atan2(h, v) * Mathf.Rad2Deg; 

if(h != 0f || v != 0f) 
{ 
    float step = Time.smoothDeltatime * speed; 
    direction = Vector3.RotateTowards(transform.forward, new Vector2(h, v).normalized, step, 0.0F); 
    Ray2D ray = new Ray2D(target.position, direction); 
    transform.position = ray.GetPoint(distance); 
    transform.rotation = Quaternion.AngleAxis(angle, -Vector3.forward); 
} 
+0

感謝您提供方法調用的提示,現在我的代碼看起來好多了!然而添加Time.smoothDeltaTime沒有爲改變角度做任何事情,並打破了我的旋轉xD –

+0

啊..沒有測試它。它沒有它的工作嗎? – maksymiuk

+0

該代碼的作品,但只有像以前一樣,沒有平滑的運動圍繞曲線的圓圈 –

0

一番搜索和一點幫助,我終於解決了這個問題,感謝球員後:)這是我想出了

public class ShieldMovement : MonoBehaviour { 

public Transform target; //player shield is attaced to 

float distance = 0.8f; // distance from player so it doesn't clip 
Vector3 direction = Vector3.up; 
public float circSpeed = 0.1f; // Speed Shield moves around ship 


// Use this for initialization 
void Start() { 

} 

// Update is called once per frame 
void Update() { 

    float rh = Input.GetAxisRaw("rightH"); 
    float rv = Input.GetAxisRaw("rightV"); 

    if(Mathf.Abs(rh) > 0.15f || Mathf.Abs(rv) > 0.15f) 
    { 
     Vector3 targetDir = new Vector3(rh, rv, 0.0f); 
     direction = Vector3.Slerp(transform.position-target.position, targetDir, circSpeed); 

    } 

    Ray ray = new Ray(target.position, direction); // cast ray in direction of point on circle shield is to go 

    transform.position = ray.GetPoint(distance); //move shield to the ray as far as the radius 

    float angleY = transform.position.y - target.position.y; 
    float angleX = -(transform.position.x - target.position.x); 

    float angle = Mathf.Atan2 (angleY, angleX) * Mathf.Rad2Deg-90; //Get angle 

    if(Mathf.Abs(rh) > 0.15f || Mathf.Abs(rv) > 0.15f) 
    { 
     transform.rotation = Quaternion.AngleAxis(angle,Vector3.forward*-1); // keep shield facing outwards in respect to player, will need revisiting on animating shield properly 
    } 


} 
解決方案

}