2017-11-11 2 views
1

Unityの視覚オブジェクトをTransformプロパティで回転できます。 1つの例外はLineRendererです。 transformプロパティを使用して移動または回転することはできません。Transformプロパティを持つLineRendererの移動と回転

LineRendererはので、私managed変換positionプロパティで、それを可動にするためにSetPositionまたはSetPositions機能を移動させたが、私はそれがあまりにも回転させることはできません。

以下は、移動可能にするコードです。

public Vector3 beginPos = new Vector3(-1.0f, -1.0f, 0); 
public Vector3 endPos = new Vector3(1.0f, 1.0f, 0); 

Vector3 beginPosOffset; 
Vector3 endPosOffset; 

LineRenderer diagLine; 

void Start() 
{ 

    diagLine = gameObject.AddComponent<LineRenderer>(); 
    diagLine.material = new Material(Shader.Find("Sprites/Default")); 
    diagLine.startColor = diagLine.endColor = Color.green; 
    diagLine.startWidth = diagLine.endWidth = 0.15f; 

    diagLine.SetPosition(0, beginPos); 
    diagLine.SetPosition(1, endPos); 

    //Get offset 
    beginPosOffset = transform.position - diagLine.GetPosition(0); 
    endPosOffset = transform.position - diagLine.GetPosition(1); 
} 

void Update() 
{ 
    //Calculate new postion with offset 
    Vector3 newBeginPos = transform.position + beginPosOffset; 
    Vector3 newEndPos = transform.position + endPosOffset; 

    //Apply new position with offset 
    diagLine.SetPosition(0, newBeginPos); 
    diagLine.SetPosition(1, newEndPos); 
} 

は私が回転することができるようにするために使用され、同じメソッドを使用しようとしましたが、私はLineRendererための回転変数にアクセスする方法がないので、オフセット取得の最初の段階で立ち往生していますが、そこです1つは位置GetPositionにアクセスするためです。

どのようにしてLineRendererローテーションを得ることができますか?LineRendererをTransformプロパティからローテーションさせるにはどうすればよいですか?

以下は、上記のスクリプトの有無にかかわらず、LineRendererの動作を示すイメージです。 Positionは現在上記のスクリプトを有効にして動作していますが、回転は有効ではありません。

+0

私はユニティに慣れていないけど、1は、 'newBeginPos = transform.rotation * newBeginPos'のようなものを思うだろうか? –

+0

存在しない 'GetRotation'関数を探していますが、現在位置取得に使用していた' GetPosition'関数があります。あなたの提案については、Rotationのオフセットを取得するためにLineRendererとそれがアタッチされているGameObjectの回転を必要とするため、動作しません。今は、このGameObjectの位置と回転を掛けるだけです。私もそれを試み、それはLineRendererを消滅させるだけです。 – Programmer

+0

私は考えることができるが動作しないことがあるいくつかの空のgameobjects(linerendererの子)は、ラインレンダラーの各端に1つ、ラインレンダラーの変換回転を使用してそれらを回転させ、それらのgameobjects位置をラインレンダラが終了します。 – Lestat

答えて

1

あなたは変換のlocalToWorldMatrixを使用することができます。

void Start() 
{  
    diagLine = gameObject.AddComponent<LineRenderer>(); 
    diagLine.material = new Material(Shader.Find("Sprites/Default")); 
    diagLine.startColor = diagLine.endColor = Color.green; 
    diagLine.startWidth = diagLine.endWidth = 0.15f; 

    diagLine.SetPosition(0, beginPos); 
    diagLine.SetPosition(1, endPos); 
} 

void Update() 
{ 
    //Calculate new postion 
    Vector3 newBeginPos = transform.localToWorldMatrix * new Vector4(beginPos.x, beginPos.y, beginPos.z, 1); 
    Vector3 newEndPos = transform.localToWorldMatrix * new Vector4(endPos.x, endPos.y, endPos.z, 1); 

    //Apply new position 
    diagLine.SetPosition(0, newBeginPos); 
    diagLine.SetPosition(1, newEndPos); 
} 
+0

これは動作しているようですが、私は 'localToWorldMatrix'がローカルからワールド空間に変換することを知っています。あなたはあなたが答えてくれたことを正確に説明できますか? – Programmer

+1

@Programmer行列の乗算は、トランスフォームの平行移動、回転、スケールをベクトルに適用します(魔法はまさにあなたが望むものです)。同様に 'transform.TransformPoint(Vector3 position)'もあります。または、linerendererのUse World Spaceをfalseに設定することもできます。 – Pluto

関連する問題