質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

UNITY スクリプトからテクスチャの切り替え

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,813

Qoo

score 1106

unity 2018.3.14f1(windowsPC向けビルド)です

3dモデルをリソースフォルダから動的に読み込みこんだ後、
下記のようにテクスチャも動的に設定しています。

エディタで確認しているのですが、実行すると
特にエラーはなく終了しているにも関わらず、モデルが表示されません。
(正確にはモデルは表示されていて、テクスチャが設定されていない状態なので見えていない)
ただ、この状態のままヒエラルキー上の3dモデルオブジェクトをクリックして展開し
マテリアルの項目を開くとなぜか、パッとシーン上に表示されます。

texture Applay()なども試してみましたが、効果がありません。
何か考えられることはないでしょうか。

public void TextureChanegTest() {

    var texture = WinTextureUtil.LoadImage(AppPath + "/" + modelCategory + "/" + texno + "/Materials/uv.png");

    foreach (Transform child in model.transform)
    {
          if (null != child.GetComponent<SkinnedMeshRenderer>())
          {
             var parent = GameObject.Find(child.name) as GameObject;
             ModelSelector.changeShader(parent, "Standard (Specular setup)", texture);
           }
     }
}

public static void changeShader(GameObject targetGameObject, string ShaderName_to, Texture2D texture)
{
    try {

         foreach (Transform t in targetGameObject.GetComponentsInChildren<Transform>(true))
         {
           if (t.GetComponent<Renderer>() != null)
           {
              var materials = t.GetComponent<Renderer>().materials;
              for (int i = 0; i < materials.Length; i++)
              {

                  Material material = materials[i];                                                           
                  material.shader = Shader.Find(ShaderName_to);                                               
                  material.SetFloat("_Mode", 1.0f);                                                           
                  material.SetTexture("_MainTex", texture);                                                   
                  material.SetColor("_Color", new Color(204f / 255f, 204f / 255f, 204f / 255f, 255f / 255f)); 

               }
           }
         }

        } catch {

            Debug.Log("changeShader Error");

        }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2019/06/10 09:58

    リファレンス(https://docs.unity3d.com/ja/2018.3/ScriptReference/Renderer-materials.html)に「If you want to change some materials in it, get the value, change an entry and set materials back.」とありますが、for文内の最後に「materials[i] = material;」を追加するとどうでしょうか。

    キャンセル

  • Qoo

    2019/06/10 10:33

    ありがとうございます!
    頂いた情報を参考に修正したところうまく表示できるようになりました!

    キャンセル

回答 1

check解決した方法

0

Cutoutの設定になるように以下のように変更したところうまく読み込むことができました。

for (int i = 0; i < materials.Length; i++)
{
 Material material = materials[i];
 material.SetTexture("_MainTex", texture);
 material.color = Color.white;
 material.SetFloat("_Mode", 1f);
 material.SetOverrideTag("RenderType", "TransparentCutout");
 material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
 material.SetInt("_ZWrite", 1);
 material.EnableKeyword("_ALPHATEST_ON");
 material.DisableKeyword("_ALPHABLEND_ON");
 material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
 material.renderQueue = 2450;

 materials[i] = material;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る