★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

Unity SDK 1.x から 2.0.08_1 に変更したらテクスチャの動的切り替えができなくなった

これまで Unity SDK 1.x (番号は失念..)で setTexture() による動的なテクスチャの差し替えを行っていましたが、先日 SDK を 2.0.08_1 に差し替えたところ、setTexture()によるテクスチャの差し替えが表示に反映されなくなりました。

一度 setTexture() でテクスチャの設定を行うと別のテクスチャへの動的な差し替えは行えないのは仕様でしょうか?

コメント

  • SDK2.0.08_1で確認しましたが、テクスチャの動的な切り替えはできるかと思います。
    どのようなコードを書いているのか教えてもらえますか?
  • 確認およびコメントありがとうございます。
    再現コード少々おまちください。
  • 編集済: 7月 2015
    遅くなりましたが、おおよそ以下のようなコードを書いています。
    (本来のコードはもっと複雑でこのスペースで説明するのが困難なため処理の要点を抜粋、および処理を簡略化して記述しています)
    (あちこち省略しているのでこのままのコードではまともに動作はしないと思いますので、その点はご容赦ください)
    class MyLive2DModel {
    	// モデルデータ(.moc)
    	public TextAsset m_modelData;
     
    	// 標準のテクスチャ
    	// 例えば 0:ボディ, 1:ヘアスタイル, 2:ドレス, ...
    	// というように配列にテクスチャを割り当てている
    	public Texture2D[] m_textures;
     
    	// 髪色差し替え用のテクスチャ
    	// 例えば 0:金, 1:茶, 2:黒 のように髪色毎に対応するテクスチャを割り当てている
    	public Textures2D[] m_hairTextures;
     
        // 差し替え用のテクスチャを指すインデックス
        int m_hairColorIndex = -1;
     
    	// Live2Dモデル
    	Live2DModelUnity 	m_live2DModel;
     
    	// 最初に1度だけ呼び出す
    	public void Initialize() {
    		// Live2Dモデルデータの読込み
    		Live2D.init ();
    		m_live2DModel = Live2DModelUnity.loadModel(m_modelData.bytes);
    		
    		// (1) --- テクスチャの読込
    		LoadTextures();
     
    		// レンダリングモード・モーションの初期化
    		m_live2DModel.setRenderMode(Live2D.L2D_RENDER_DRAW_MESH);
     
    		// いろいろ初期化のコード
    	}
     
    	// Live2Dモデル描画(MonobehaviourのUpdate()から呼び出す)
    	public void DrawModel() {
    		m_live2dMode.update();
    		m_live2dMode.draw();
    	}
     
    	// 髪色の変更
    	public void SetHairColor(int colorIndex) {
    		m_hairColorIndex = colorIndex;
    		// (2) --- テクスチャの差し替え
    		LoadTextures();
    	}
     
    	// テクスチャの割り当て
    	void LoadTextures() {
    		m_live2DModel.deleteTextures();
    		
    		for (int i = 0; i < m_texturesCount; i++) {
    		
    			// デフォルトは標準のテクスチャ
    			Texture2D tx = m_textures[i];
    			
    			// ヘアスタイル用のテクスチャを選択した髪色に応じて差し替える
    			if (i == 1) {
    				// 髪色の指定があればテクスチャ差し替え
    			    if (m_hairColorIndex >= 0)
    					tx = m_hairTextures[m_hairColorTextures];
    			}
    			
    			// テクスチャを設定
    			m_live2DModel.setTexture(i, tx);
    		}
    	}
    }
    
    上記の Initialize() から呼び出す LoadTexture() でデフォルトのテクスチャをモデルに適用されますが、以降、SetHairColor() を呼び出して テクスチャの差し替えを行っても、モデルの表示に反映されないという現象となっています。

    上記動作を確認した Unityのバージョンは 4.6.6p4 です。
  • 私が確認したのはL2D_RENDER_DRAW_MESH_NOWモードでした。
    このモードならテクスチャが即座に切り替わるようです。

    L2D_RENDER_DRAW_MESHモードの場合は、Live2DModelUnity.loadModelをテクスチャ差し替え時に指定すれば切替できました。
    SDKのSimpleプロジェクトで髪テクスチャだけ差し替えてみましたが、以下のようなソースになります。
    Unity5.0.2p1で確認しましたが4.6.6p4でも問題ないかと思います。

    [SimpleModel.cs]
    using UnityEngine;
    using System;
    using System.Collections;
    using live2d;

    [ExecuteInEditMode]
    public class SimpleModel : MonoBehaviour
    {
      public TextAsset mocFile ;
      public Texture2D[] textureFiles ;
      
      private Live2DModelUnity live2DModel;
      private Matrix4x4 live2DCanvasPos;
      
      void Start ()
      {
        Live2D.init();

        //live2DModel = Live2DModelUnity.loadModel(mocFile.bytes);
        //for (int i = 0; i < textureFiles.Length; i++)
        //{
        // live2DModel.setTexture(i, textureFiles[i]);
        //}
        //// レンダリングモード・モーションの初期化
        //live2DModel.setRenderMode(Live2D.L2D_RENDER_DRAW_MESH);


        LoadTextures();

        float modelWidth = live2DModel.getCanvasWidth();
        live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50.0f, 50.0f);
      }

      void LoadTextures()
      {
        // L2D_RENDER_DRAW_MESHの場合は、テクスチャリセット時以下の1行も必要
        // L2D_RENDER_DRAW_MESH_NOWの場合は不要

        live2DModel = Live2DModelUnity.loadModel(mocFile.bytes);

        // レンダリングモード・モーションの初期化
        live2DModel.setRenderMode(Live2D.L2D_RENDER_DRAW_MESH);
        for (int i = 0; i < textureFiles.Length; i++)
        {
          live2DModel.setTexture(i, textureFiles[i]);
        }  
      }

      void ChangeTexture(String texturepath)
      {
        textureFiles[1] = Resources.Load(texturepath) as Texture2D;
        LoadTextures();
      }

      // UGUIボタンから呼び出す
      public void Changebtn0()
      {
        ChangeTexture("haru.1024/texture_01");
      }
      // UGUIボタンから呼び出す
      public void Changebtn1()
      {
        ChangeTexture("haru.1024/texture_01_1");
      }

      //void OnRenderObject()
      //{

      void Update()
      {
        if (live2DModel == null) return;
        live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);

        if (!Application.isPlaying)
        {
          live2DModel.update();
          live2DModel.draw();
          return;
        }

        double t = (UtSystem.getUserTimeMSec()/1000.0) * 2 * Math.PI ;
        live2DModel.setParamFloat( "PARAM_ANGLE_X" , (float) (30 * Math.Sin( t/3.0 )) ) ;
        
        
        live2DModel.update();
        live2DModel.draw();
      }
    }
  • 編集済: 7月 2015
    検証ありがとうございます。

    おっしゃるとおり、現在の読み込み済みのモデルを捨てて、再度 Live2DModelUnity.loadModel() でモデルを読み込み直せばテクスチャを設定し直すことできるのは確認できたんですが、やはり以前(SDK 1.x の頃)の挙動に戻してほしいですね...(これが仕様でないのなら)

    というのも、SDK 1.x の時点では モーション再生中にモーションを途切れさせずに自然に着せ替えができてたんですが、SDK2.0.08_1 した途端、着せ替えのたびにモーションが初期化されてギクシャクするので、、、ちょっと挙動として微妙なのです。

    Unity-iOSの64bitビルド(IL2CPP)に絡んで今更 1.x には戻せないし、RenderModeを変えるとオブジェクトの重ね合わせ等にも問題でるので変えられず...

    まあ結論としては、将来この挙動が改善されることを期待しつつ、当面はテクスチャ切り替えるタイミングで、loadModel() でモデルを読み込み直す方法で回避します。

    ありがとうございました。
コメントするにはサインインまたは登録して下さい。