2017-09-06 10 views
0

私のオブジェクトが目標の方向に永遠に移動し続けるように、または衝突するまで、衝突部分はすでに処理しています。しかし、私は動きの部分に問題があります。衝突までオブジェクトを変換する

私が最初にこれは完璧に動作し、私のオブジェクトは、私はそれがしたい方向に回転するコード

Vector2 diff = target - transform.position; 
float angle = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg; 
transform.rotation = Quaternion.Euler(0.0f, 0.0f, angle); 

のこれらの行を使用して、私のターゲットを回転させるようにしてみてください。私は

if (isMoving) 
    { 
     Vector2 f = transform.forward; 
     transform.position = Vector3.MoveTowards(transform.position, target + Vector3.forward, speed * Time.deltaTime); 
    } 

を以下している私のUpdateメソッドで は今、これは動作しますが、目標を達成するために失敗し、私は、それが理にかなっている理由を知っているが、それを修正する方法がわかりません。オブジェクトは正しい方向にポイントに移動しますが、ターゲットで停止しないようにしたいので、そのまま続けてください。

私はまた、Rbがrigidbody2D

など

rb.AddForce(rb.position + f * Time.deltaTime * speed); 

しかし、いずれの場合も、オブジェクトの回転であるが、私はまた、変換に使用

を移動したことがない

rb.MovePosition(rb.position + f * Time.deltaTime * speed); 

を試してみましたMovePositionと同じ動作

P.S.それは2Dゲームです

+0

更新、衝突トリガなどのコードを投稿してください。 – Isma

+0

@Ismaありがとうございました。私は線方程式を使用して解決できました。あなたがそのアプローチを見たいと思ったら私の質問に答えました。 –

答えて

0

インターネットを見て、実際に私が探しているものは見つかりませんでした。キネマティックオブジェクトを永遠に翻訳することはできません(明らかに、オブジェクトはいくつかの点で何かが破壊されたが、それは問題ではない)。そこで私は先に進み、これを簡単にするために私自身の図書館を書くことに決めました。私は、線方程式を使って目標を達成することができました。シンプル私は私の問題を解決するためにこれらの手順を取った。私は固定X値(ステップ)の行の式を使用してオブジェクトを変換

  • y切片を計算し、すべてのx値は、対応するyの値を求める
  • 2点間の傾きを取得開始時

    1. オブジェクトをそのオブジェクトに変換します。
    2. FixedUpdateで手順3を繰り返します。それだけです。

    もちろん、x = 0の場合、傾きが0になるか、y = 0となるような扱いがあります。ライブラリのすべてを解決しました。あなたが興味を持った人のためにここでそれをチェックすることができますEasyMovement

    あなたがライブラリを望まないなら、ここにそれを行う簡単なコードがあります。で今

    //Start by Defining 5 variables 
    private float slope; 
    private float yintercept; 
    private float nextY; 
    private float nextX; 
    private float step; 
    private Vector3 direction; //This is your direction position, can be anything (e.g. a mouse click) 
    
    スタート方法で

    //step can be anything you want, how many steps you want your object to take, I prefer 0.5f 
    step = 0.5f; 
    
    //Calculate Slope => (y1-y2)/(x1-x2) 
    slope = (gameObject.transform.position.y - direction.y)/(gameObject.transform.position.x - direction.x); 
    
    //Calculate Y Intercept => y1-x1*m 
    yintercept = gameObject.transform.position.y - (gameObject.transform.position.x * slope); 
    

    FixedUpdate

    //Start by calculating the nextX value 
    //nextX 
    if (direction.x > 0) 
        nextX = gameObject.transform.position.x + step; 
    else 
        nextX = gameObject.transform.position.x - step; 
    
    //Now calcuate nextY by plugging everything into a line equation 
    nextY = (slope * nextX) + yintercept; 
    
    //Finally move your object into the new coordinates 
    gameObject.transform.position = Vector3.MoveTowards(gameObject.transform.position, new Vector3(nextX, nextY, 0), speed * Time.deltaTime); 
    

    条件がたくさんあり、これは力仕事をしない覚えておいてくださいそれを考慮する必要があります。

    関連する問題