はらけんログ

unity触ったりバイクに乗ったり

【Unity】MaterialのPropertyIDについて

UnityのMaterialはEmissionの値やMainTextureのデータなど、様々な値を外部からセットできます。

その時に使うのが、material.Set〇〇みたいな関数です。

SetInt

SetFloat

SetColor

SetTexture

などなど

 

例えば、色を変えたいとなった時、

material.SetColor("_Color",new Color(1,1,1));

 みたいに書くと思います。

 

実は上記のようなSet〇〇の第1引数はintでも可能なんです。

docs.unity3d.com

で、引数をstringにしていると、それを内部的にintに変換するようで、要はintで指定したほうが処理が早いみたいなんですね。

 

じゃあ、自分が設定したいPropertyNameのintはどう取得するの?

こちらです。

 

int propertyID = Shader.PropertyToID("_Color"); //取得したいPropertyName

 

一回記録しておくだけで良いので、Start関数などで代入しておいて、それを使い回せばおk!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PropertyIdTest: MonoBehaviour {

  int colorID;

  int emissionID;

  void Start(){

    colorID = Shader.PropertyToID("_Color");

    emissionID = Shader.PropertyToID("_Emission");

  }

 

  void SetMaterialColor(Material mat, Color col){

    mat.SetColor(colorID,col);

  }

  

  void SetMaterialEmission(Material mat, Color col){

    mat.SetColor(emissionID ,col);

  }

}

 

 

書いてる途中で、いい記事を見つけたので、こちらを参考にしたほうがイイかもです。。。

 

 

www.shibuya24.info

以上。

【Unity】Meshどうしの頂点をピッタリくっつけたい時

Unityさんでなぁ!MeshとMeshの頂点をなぁ!ピッタリくっつけたいときはなぁ!

 

Vキーを押しながらドラックアンドドロップ!

 

youtu.be

 

以上。

【Unity】スクリプトからMaterialをオブジェクトごとに変更

Unity触りはじめてしばらくたったが、本当に今更な事に気づいたのでメモ。アタシってほんとバカ。。。

 

いままで、スクリプトからMaterialのColorとかEmissionとかを変更したいとなった時、変更したいMaterialを直接宣言してました。しかし、この方法では同じMaterialのオブジェクトの色がすべて変わってしまいます。

 

かと言って、オブジェクトの個数分Materialを用意するのもスムーズではありません。更にはMaterialの設定を実行中に変更して停止すると変更がもとに戻りません。

 

そこで、オブジェクトのMaterialをオブジェクト1つずつ個別に設定する方法について記載します。

 

1,とりあえずMaterialの色を変えてみる

下の画像のように、スクリプトを貼り付けた空のGameObjectと、自分で作ったMaterialをCubeたちのMaterialに設定し配置しました。

f:id:HarakeN:20180703184038p:plain

 

「ChangeMaterial 」のスクリプトは下記とおり。

public class ChangeMaterial : MonoBehaviour {
 public Material testMat;

 void Start()
 {
  SetMatColor(Color.red);
 }

 void SetMatColor(Color col )
 {
  testMat.color = col; //Materialの色を変える
 }
}

 

 

 実行すると、両方のCubeの色が変わりました。

f:id:HarakeN:20180703184228p:plain

 

 

2,Cubeごとに色を変える

さて、本題です。オブジェクトの色を個別に設定する場合は、Materialを宣言するのではなく設定したいオブジェクトのMeshRendererを宣言します。

スクリプトは下記のように変更してください。

public class ChangeMaterial : MonoBehaviour {
 public MeshRenderer cube1;
 public MeshRenderer cube2;

 void Start()
 {
  SetMatColor(cube1,Color.red);
  SetMatColor(cube2, Color.blue);
 }

 void SetMatColor(MeshRenderer mesh,Color col )
 {
  mesh.material.color = col; //meshのmaterialの色を変える
 }
}

 

下図のようにInspectorでスクリプトにCubeを設定して実行すると、個別に色が変わります。

f:id:HarakeN:20180703190122p:plain

 

 

3、仕組みについて

MaterialはMeshごとにInstanceされます。そのInstanceされたMaterialにアクセスするにはRenderer.materialからアクセスします。

f:id:HarakeN:20180703191506p:plain

 

 

逆にInstanceされる前(ベースとなるMaterial)を変更したいのであればMaterial

から直接アクセスします。(伝われ)

docs.unity3d.com

docs.unity3d.com

 

 

使い所によってどちらが良いか見極めてから実装するほうがいいですね。

 

 

 

【MotoBlog】初めてバイクでの帰省

なんだかんだ忙しかった上に、仕事がうまくいかないとブログ止まりますね。

生存報告がてら近況報告。

 

5月の中頃、大型二輪免許を無事取得し、晴れてハーレー乗りになりました。

しばらく、あちこち走ってみましたが、、、

 

公道怖いわー

 

中距離を走ったり高速道路を走ってみたりと、早く慣れるように努力してます。

 

...

先週末には静岡の実家へバイクで帰りました。

晴れた日に広い道路をマイペースで走るのは最高に気持がいいですね。

https://www.instagram.com/p/Bko_yiVB5hK/

Instagram post by はらけん • Jun 30, 2018 at 7:33am UTC

 

 

僕の地元はちょっと有名な観光地「修善寺」です。「修禅寺」というお寺が地名の由来で、僕の家はこの寺の檀家だったりします。

https://www.instagram.com/p/BkojmNjB9z0/

ただいま

 

 

祖父の23回忌、祖母の3回忌のための帰省だったのですが、バイクと生前の祖父について家族から話を聞きました。

 

「昔、お前のじいちゃんは『ばあちゃんをハーレーのサイドカーに乗せて走ってやるんだ。』とよく話していた。ついには叶わなかったがな。」

 

昔は大型バイク免許は一発試験で取得が難しく、その上家はもともと裕福ではなかったたので、ハーレーを買うお金もなかったのだとおもいます。

あんなにもバイクを否定していた母が、ハーレーに乗りたいと言った僕のことを、強引に止めようとはしなかったのは、そんな話があったからでしょう。

 

今ではサイドカー付きの車両は販売されていませんが、いつか僕も結婚した時、後ろにお嫁さんを乗せて、地元の道を走ってみたいなと思わせてくれたエピソードでした。

 

...

これからはいつでも「自分の足」で帰ることができるようになりました。あの頃、想像していた未来の自分とは少し違う人生をたどっていますが、本当に大人になったなと自分でも思います。

 

今年もあと半分頑張ろう。

 

【Unity】StartとかUpdateについて

unityに慣れてしまっていたので記憶から消えていた疑問なんですが

「UnityってなんでStart()とかUpdate()とかだけ勝手に実行されんの?」

「UnityのStratとかUpdateって、どのスクリプトのUpdate(Start)がどの順番で実行されてんの?」

うーん...わからん

Unityが作りやすいように魔法の呪文を用意してくれていて、実行順が重要な作り方でない限り、毎フレーム必要な処理はUpdateに、起動時に必要な処理はStartに書いておけばおk!

と、いう感じで使っている人多いですよね。でも、モヤモヤが無くならない人も多いハズ。

ってことで、調べたらモヤモヤの正体がわかるとてもわかり易い記事がありました。

blogs.unity3d.com

unity-michi.com

 

要は「MonoBehaviourが設定した魔法の呪文メソッドが、各魔法の呪文リストにランダムな順番でaddされて、決まった順番で魔法の呪文リストが実行される」からモヤモヤするみたいっすね。(日本語ムズイ

docs.unity3d.com

 

って、ことで上記記事からも分かる通り、むやみにスクリプトを増やしまくってUpadeなりを実行させるとかなり負荷がかかるみたい。

 

個人的には、毎フレーム実行したい関数はUpdateAction()みたいな名前にして、それらクラスを参照したSceneManagerクラスのUpdate()でUpdateAction()をすべて呼び出したら実行順も決めやすいし、わかりやすいし、良いような気がする。

 

public class SceneManager : MonoBehaviour {

 

     DataManager dataManager; 

     TimerManager timerManager;   

     DebugManager debugManager;

 

      void Awake()    { 

          dataManager.Awake_Action(); 

          timerManager.Awake_Action(); 

          debugManager.Awake_Action(); 

    } 

    void Start () {     

          dataManager.Start_Action();       

          timerManager.Start_Action();

          debugManager.Start_Action();

    }

    void Update () {

          dataManager.Update_Action();       

          timerManager.Update_Action();

          debugManager.Update_Action();

    }

}