Unity:プログラムによる変更をテレインSplatPrototypeに適用する方法?


8

テレインオブジェクトを追加するスクリプトがあります(パブリックテレインフィールドにテレインをドラッグアンドドロップします)。

テレインはすでにUnityで2つのPaintTexturesが設定されています。1は正方形(タイルサイズで設定され、市松模様のパターンを形成する)で、2つ目は草の画像です。

Unityスクリーンショット

また、最初のPaintTextureのターゲット強度が低下しているため、市松模様のパターンによって下にある草の一部も表示されます。

ここで、実行時に、最初のPaintTextureのタイルサイズを変更します。つまり、さまざまな実行時の条件に応じて、チェッカーを増減します。Unityのドキュメントを調べたところ、Terrain.terrainData.SplatPrototypeこれを変更できる配列があることがわかりました。またRefreshPrototypes()terrainDataオブジェクトのFlush()メソッドとオブジェクトのメソッドがありTerrainます。だから私はこのようなスクリプトを作りました:

public class AStarTerrain : MonoBehaviour {

    public int aStarCellColumns, aStarCellRows; 

    public GameObject aStarCellHighlightPrefab;
    public GameObject aStarPathMarkerPrefab;
    public GameObject utilityRobotPrefab;
    public Terrain aStarTerrain;

    void Start () {
            //I've also tried NOT drag and dropping the Terrain on the public field 
            //and instead just using the commented line below, but I get the same results
        //aStarTerrain = this.GetComponents<Terrain>()[0];
        Debug.Log ("Got terrain "+aStarTerrain.name);

        SplatPrototype[] splatPrototypes = aStarTerrain.terrainData.splatPrototypes;
        Debug.Log("Terrain has "+splatPrototypes.Length+" splat prototypes");
        SplatPrototype aStarCellSplat = splatPrototypes[0];
        Debug.Log("Re-tyling splat prototype "+aStarCellSplat.texture.name);
        aStarCellSplat.tileSize = new Vector2(2000,2000);
        Debug.Log("Tyling is now "+aStarCellSplat.tileSize.x+"/"+aStarCellSplat.tileSize.y);
        aStarTerrain.terrainData.RefreshPrototypes();
        aStarTerrain.Flush();
    }

//...

問題は、何も変更されず、チェッカーマップが再タイル化されないことです。コンソール出力は、正しい名前のTerrainオブジェクトがあり、適切な数のスプラットプロトタイプがあり、正しいテクスチャに対応するSplatPrototypeオブジェクトのtileSizeを変更していることを正しく通知します。また、値が変更されたことがわかります。しかし、実際のグラフィック表示では何も更新されません。

では、何が欠けているのですか?


cusomシェーダーがあり、マップ上に異なる値で青い線グリッドを作成したい場合、最も安い方法は、シェーダーでそれを行うことです...青い線は:round(frac(x * .1)...です。一体それを答えに入れて
com.prehensible '09 / 09/14

回答:


1

スプラットテクスチャを再割り当てするのを忘れたようです:

public class AStarTerrain : MonoBehaviour {

public int aStarCellColumns, aStarCellRows; 

public GameObject aStarCellHighlightPrefab;
public GameObject aStarPathMarkerPrefab;
public GameObject utilityRobotPrefab;
public Terrain aStarTerrain;

void Start () {
        //I've also tried NOT drag and dropping the Terrain on the public field 
        //and instead just using the commented line below, but I get the same results
    //aStarTerrain = this.GetComponents<Terrain>()[0];
    Debug.Log ("Got terrain "+aStarTerrain.name);

    SplatPrototype[] splatPrototypes = aStarTerrain.terrainData.splatPrototypes;
    Debug.Log("Terrain has "+splatPrototypes.Length+" splat prototypes");
    SplatPrototype aStarCellSplat = splatPrototypes[0];
    Debug.Log("Re-tyling splat prototype "+aStarCellSplat.texture.name);
    aStarCellSplat.tileSize = new Vector2(2000,2000);
    splatPrototypes[0] = aStarCellSplat; // <- here
    Debug.Log("Tyling is now "+aStarCellSplat.tileSize.x+"/"+aStarCellSplat.tileSize.y);
    aStarTerrain.terrainData.RefreshPrototypes();
    aStarTerrain.Flush();
}

//...

ちなみに、あなたはこのようにすることができたでしょう:

splatPrototypes[0].tileSize = new Vector2(2000,2000); //No referencing issue this way

(そして更新しますが、この状態でそれが必要かどうかさえわかりません)

編集:

参照できないオブジェクトにいくつかのパラメーターがあり、私は信じています

splatPrototype.tileSize

それらの1つなので、次のようにします。

SplatPrototype aStarCellSplat = splatPrototypes[0];

その場合、aStarCellSplatはsplatPrototypes [0]のクローンですが、それを参照しません。特に複雑な構造を変更する場合、初期値を取得してそれから反復するために複製することは良いことですが、この場合、単純なパラメーター呼び出しの方が簡単です。

クローンを追跡します。クローンを作成する場合は、割り当てることを忘れないでください。


-1

シェーダーを介して青い線を作成するには、surface関数またはfract関数にtexture_uvが必要です...

Shaderlabで青/灰色のグリッド線を作成するには、合計4〜5本の線をsurf関数内のシェーダーに追加する必要があります。

xline = ceil(frac(uv.x * .1)-。75); yline = yと同じ

グリッド= max(xline、yline);

o.albedo.blueval =グリッド。

次に、シェーダーの1回の呼び出しを使用してyoruグリッドサイズを変更し、シェーダー値を変更します。.lは10メートルのグリッドを作成し、その値を適切なグリッドサイズに変更します。 。

次に、前のバージョンの/ splatmapで使用されていたのと同じ色に数学を追加して色を微調整します。


いくつかの有用な情報を提供していますが、これは実際に直接尋ねられた質問に答えるものではありません。OPがシェーダーを介してこれを行う方法を実際に知りたいのであれば、彼は尋ねたでしょう。
ピップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.