名古屋でアプリ・VR開発を行っています
ワクワクできるゲームをガンガン開発リリース中!

【Unity】LineRendererのGetPositionsの使い方

こんにちは、SAT-BOXのコアラです

Unityを使っていて、LineRendererクラスのGetPositions関数の使い方が少し特殊だなと思ったので紹介します

LineRendererは点と点を繋ぐ線を作れるもので、GetPositions関数を使うと点の位置をすべて取得できます
ちなみにTrailRendererにも同名の関数があり使い方も同じでした

早速ですがそのソースコードを載せます

public class Sample : MonoBehaviour {
    public LineRenderer line;
    
    void SampleMethod() {
        var positions = new Vector3[line.positionCount];
        int cnt = line.GetPositions(positions);
    }
}

※Unity5系列だと、GetPositions関数自体が無いバージョンがあります


解説します

まず、点の位置の配列は positions に入っています
え?と思うかもしれませんが、実際取得できていました
GetPositions関数の引数で渡した配列が参照渡しのような扱いになっているのかもしれません
outパラメーターをつける必要もないです、これ以上のことは僕にはわかりません

次に、cnt に入っている数値は、この場合は line.positionCount と同じです
じゃあ cnt って何が返ってきてるんだって話ですが、これは配列の中身を書き換えた数が返ってきてます
この説明だけだとよく分からないと思うので、ソースコードを少し変えたもので説明します

public class Sample : MonoBehaviour {
    public LineRenderer line;
    
    void SampleMethod() {
        var positions = new Vector3[100];
        int cnt = line.GetPositions(positions);
    }
}

配列の長さを100に固定してみました
長さが line.positionCount と違う場合は事情が変わってきます

・LineRendererの点の数が100未満の場合

この場合は、cnt の数値は line.positionCount と同じになります
そして、配列の positions は、長さは100のままですが、点が無い場所の数値は変わりません
例えば点の数が50だとすると、cnt は50になり、positions の0~49番目の数値は点の位置が入り、50~99番目はそのまま (初期化しているのでVector3.zero) です


・点の数が100を超える場合

こちらは、このエラーが出ます
f:id:sat-box:20200217171604p:plain

渡した配列が短いよっていうエラーですね
これが出ても配列の変更は反映されています
cnt は100が返ってきて、positions は0~99番までの点の位置が入り、長さは100のままです

このエラーで処理が止まるなどの実害はなさそうですが、エラーはエラーなので回避したほうが良さそうです

基本的には、配列の長さを line.positionCount と同じにしておけば良いです


使い方のまとめとしては、

1. 配列の長さが LineRenderer の positionCount と同じVector3配列を用意する
2. GetPositions関数の引数にVector3配列の変数を渡す

これだけです (TrailRendererも同じ)


以上がGetPositions関数の使い方になります