UnityのpublicとSerializeFieldの違い

publicとSerializeField使い方はどちらも似ているのですが、
違う部分は、

publicは
 inspectorからの操作:可能
 他のscriptからの操作 :可能
SerializeField
 inspectorからの操作:可能
 他のscriptからの操作 :不可

チーム開発している場合には、他のscriptから参照可能な状態だと、間違って操作されてしまう可能性があります。(Unityはpublicを推奨しているようですが….)
inspectorから操作したいだけの場合は SerializeField を使うのがいいのではないでしょうか。

Unityビルド時に、Building scene 0: から進まない問題の解決方法

以前、書いた記事で似たようなエラーがありました。
原因は、理解しきれいていないのですが、解決方法は同じでした。

Rendering > Lightsetting > Auto Generate をoffにすると、ビルドが進みました。

どうやら、UnityでのLightの処理負荷は、ビルド時に影響を及ぼしやすいのではないか、と思っております。

Unityでコルーチンを用いて、時間をずらして処理する方法

Unityで時間差の処理を用いる方法は幾つかあります。
その中で、コルーチンのやり方をお伝えします。

コルーチンを用いる方法は
(1):コルーチン関数を定義する
(2):コルーチン関数を呼び出す

(1):コルーチン関数を定義する

gameobjectをtrueにした3秒後にfalseにする関数
//関数名称  CoroutineTest() 
private IEnumerator  CoroutineTest() {     

//コルーチンの内容     
gameobject.SetActive(true);     
yield return new WaitForSeconds(3.0f);      
gameobject.SetActive(false); 

} 

(2):コルーチン関数を呼び出す

StartCoroutine("CoroutineTest");

コルーチン関数に引数が必要なときの書き方

(1):コルーチン関数を定義する

 //関数名称  CoroutineTest() 
private IEnumerator  CoroutineTest(Bool judge) {     

//コルーチンの内容     
gameobject.SetActive( judge );     
yield return new WaitForSeconds(3.0f);      
gameobject.SetActive( !judge ); 

}  

(2):コルーチン関数を呼び出す

StartCoroutine( CoroutineTest ( judge ))

Unity×Photonで、Photon.Punがusingでリンクできない問題を解決した

Photonを使っていますでしょうか。
Photonを使っている方は、リアルタイム通信のマルチプレイヤーアプリケーションを作成している方かと思います。

見よう見まねで、Photonを使い始めたのですが
Asset storeからimportして、使い始めようとしたら初っ端から躓きました。

using Photon.Pun;

これで、使い始められると書いてあるのですが、これがエラーになる。(リンクできない状態)
で、海外の情報とかを調べていくと、同じ状態で苦しんでいる方々を発見しました。(サイトどれでみたか出てこない….)

解決方法

解決方法はシンプルでした。
Unityのバージョンを変更してあげるでOKでした。

現在:2020年5月
使用したバージョン(エラーした版):2019.3.12f1

変更 したバージョン:2019.1.0f2

これで、問題なく、Photon.Punに接続することができました!!
実行タイミングによっては、違うバージョンで対応可能になっている可能性もあるかと思います。
Unityバージョンで解決可能くらいのテンションでいるといいかと思います。

Baked lightmap filtering failed. The final baked lightmap is likely to have poor quality. Try disabling the Optix denoiser or lower the lightmap resolution

Unityを利用している際に出現したエラーです。ビルドした際にでました。

Baked lightmap filtering failed. The final baked lightmap is likely to have poor quality. Try disabling the Optix denoiser or lower the lightmap resolution

何のエラーかもわからずに、
下記のUnity communityのあいだでも、解決方法分からないといった内容が出ていました。

https://forum.unity.com/threads/baked-lightmap-filtering-failed.670549/

自分も原因は分からなかったのですが、
Rendering > Lightsetting > Auto Generate
をoffにすると、エラーなくなりました。

常時ライトを照らす、みたいな設定だったかと思いますが
何か処理が重くなってしまっていたのでしょうか…!!

Unityで特定のObjectに接触している物体を触れて×アクション(取得Keydown)をした際にのみGETする方法

触れている物体をGETする方法を記載していきたいと思います。
あまり有効な記事ではない可能性もあります!
自分の備忘録的に書いていきたいと思います。

やりたいことは、
特定のObjectに接触している物体を触れて×アクション(取得Keydown)をした際にのみGETする、といった具合です。

色々やり方があるかと思いますが
今回、重要な要素としたい部分は、接触しているObjectの名称をデータとして保持するということです。

// now touchの変数を作成
string nowTouch;

void Update() {     

 // keydown Space がクリックされたときのみ発火
 if (Input.GetKeyDown(KeyCode.Space)) {         

  //  now touch の変数に合わせて処理を変更
  if (nowTouch== "Cube") {             
  } else if (nowTouch== "Box") {
  } else if (nowTouch == "Sphere"){ 
  }
 }
}

 //  接触した際に、接触したObjectを nowTouch へ代入
private void OnTriggerEnter(Collider other) {     
nowTouch = other.name;     
}

  //  接触が離れた後に、nowTouch を空へ
void OnTriggerExit(Collider other) {     
nowTouch = "";     
}

UnityのStart以前でのデータ処理順番

今回はふと、気になったことを、書いていきます。
UnityのEvent処理順番は下記のように記載されています。

https://docs.unity3d.com/jp/460/Manual/ExecutionOrder.html

ここで、理解できなかったのが、Inspector上でのデータセットが順番にどう影響するのかです。

今回、3パターンでのデータセットが順番としてどんな影響を及ばすのかを調べました。

パターン1:class内のグローバルエリア(start , updateでも無いエリア)
パターン2:inspectorでのデータ設定
パターン3:Start 内のデータ設定

public class test : MonoBehaviour
 {
  // パターン1
 public int No = 15; 

void Start() {  
   // パターン3
   No = 15;
 }

 void Update()
     {
         Debug.Log(No);
     }
 }

結果は、
パターン1 → パターン2 → パターン3の順番で処理されていました。
inspectorで設定したNo変数の値は、StartでNo変数が上書きされます。

UnityでLightが常にPlayerを照らしてくれる設定

以前、FPS視点のCameraワークを設定するコードを書きました。
このコードを利用すれば同じ考え方でLightも動かすことが可能です。

前回、 Playerの子階層に、新しくGameObject cameraFollow を作成しました。
今回は、cameraFollowに対して、Lightを紐づけていきます。
と、いうのも常に、Playerの後ろ側から光が照らされる状態を作ります。

void Update() {     

\\cameraFolowのy軸15f, z軸3fのpositionへ
transform.position = GameObject.Find(" cameraFollow ").transform.position + new Vector3(0,15f,3f); 
    
 \\Lightは常にPlayerの方向を向くようへ
 transform.LookAt(GameObject.Find("Player").transform); 
}

windowsでディスプレイの配置を左右変更する方法

ディスプレイを使うと、使わないとでは、生産性が大分変ります。
今回は、ディスプレイをPCの左側・右側のどちらかに配置変更する方法です。

PCにディスプレイを接続した状態で、
設定 > システム > ディスプレイ まで行ってください。

すると、ディスプレイの配置を変更する画面が表示されます。
基本的には、PCが1番・ディスプレイが2番に識別されているはずです。

左側・右側に都合いいほうへ、2番をドラックアンドドロップで、動かしてみると配置変換ができます。

UnityのCanvasを活用して、HPのゲージを作成

以前、HPの減少を扱うscriptを作成する記事を書きました。

この変化するHPをゲージとして、画面上に表示していきたいと思います。
CanvasのSliderを使います。

大まかな流れ
(1):Sliderの配置
(2):SliderのValueにデータを反映するscriptを作成
(3):HPのデータと、Sliderのデータを接続

(1):Sliderの配置

hierarchyで、
Create > UI > Canvasを
Canvasの子階層にて
Create > UI > Sliderを選択してください。

POSX・POSYで好きな場所へSliderを合わせてください。
(Canvas・Sliderの細かい説明は省きます。)

最終的にやりたいことは、SliderのValueにHPを反映していくことです。

(2):SliderのValueにデータを反映するscriptを作成

CanvasにAdd Component でscriptをNew作成する。
(名称を PlayerUI とする)

public class PlayerUI : MonoBehaviour
 {
     public Slider slider;

public void first(int maxHP) {     
//maxValueとValueを初期設定
slider.maxValue = maxHP;     
slider.value = maxHP; 
} 

public void HPUpdate(int HP) { 
 //ここでvalueを反映
slider.value = HP; 
}

}

※CanvasのInspectorにて、表示されているSliderと、hierarchy上のsliderを紐づけ忘れずに

(3):HPのデータと、Sliderのデータを接続

前回の記事の
private void updateHP(float deltaHPacc) 関数に追記していきます。

public class PlayerManage : MonoBehaviour
 {
public PlayerUI playerUI;


\\上記記事で作成した関数
private void updateHP(float deltaHPacc) {
 HPacc -= deltaHPacc;     
 HP = Mathf.RoundToInt(HPacc);     

\\ PlayerUIHPUpdateメソッドを呼び出している
     playerUI.HPUpdate(HP);
 
 }


}

public PlayerUIをCanvas( PlayerUI scriptが紐づいているオブジェクト)と紐づけること。