- 投稿日:2021-01-23T20:06:42+09:00
【Instantiate関数】銃弾の向きが正しい状態で発射する【テンプレスクリプト】
プレファブで弾を発射する
銃口(Muzzle)から弾(bullet)のクローンが発射される
- 下記Muzzle.csをMuzzleオブジェクト(銃口)へアタッチすることによって、プレファブ化されたbullet(弾)を発射することができます。
Muzzle.csusing UnityEngine; public class Muzzle : MonoBehaviour { public GameObject bullet; void Update() { if (Input.GetMouseButtonDown(0)) { Shot(); } } void Shot() { GameObject obj; //====+====+====+====+====+====+====+====+====+====+====+====+====+====+ //Instantiate関数の第二第三引数を設定することにより、通常の銃弾のような、 //正しい向きが求められるbulletを生成することもできます。 //====+====+====+====+====+====+====+====+====+====+====+====+====+====+ obj = GameObject.Instantiate(bullet, transform.position, transform.rotation); obj.GetComponent<Rigidbody>().AddForce(transform.forward * 1000); } }
- 投稿日:2021-01-23T15:02:27+09:00
Unityのビルボードシェーダーを実装する際に躓いた点と改善方法
概要
Unityで以下のようにカメラを傾けてもスプライトが正面を向いた状態(ビルボード)を作りたくなり、
調べていたところシェーダーを使ってビルボード表示が出来るということで、
幾つかのサイトを参考に試してみました。
(カメラのprojectionをorthographicにするだけだと正面は向いても傾けた分だけ縦横比が崩れてしまいうまく行きませんでした)試したところいくつかの記事の内容を組み合わせることで実現出来たため、
躓いた点と解消方法をまとめます。※Unityを使用してこのような2.5D風(くにお君、River city ransom風?)の表現をするのにこういった方法が
合っているか分かっていない状態です。この他に良い実現方法があれば教えていただきたいです...。
エディタ上の表示 実行中(カメラが30度傾いている) 最終的に使用したスクリプト
現在使用しているスクリプトは以下の通りです。
座標変換は以下の記事を参考にさせていただきました。
* Y軸ビルボードシェーダーの実装と解説
BillboardShader.shader
Shader "Custom/Billboard" { Properties { _MainTex("Texture", 2D) = "white" {} } SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "DisableBatching" = "True" // Prefabなどで複製した複数のスプライトを正しく表示させるために必要だった } Cull Off //左右反転させた時に描画させるために必要だった Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert(appdata v) { // 座標変換は以下の記事を参考にさせていただきました。 // https://gam0022.net/blog/2019/07/23/unity-y-axis-billboard-shader/ v2f o; // ①Meshの原点をModelView変換 float3 viewPos = UnityObjectToViewPos(float3(0, 0, 0)); // ②スケールと回転(平行移動なし)だけModel変換して、View変換はスキップ float3 scaleRotatePos = mul((float3x3)unity_ObjectToWorld, v.vertex); // ③View行列からX軸の回転だけ抽出した行列を生成 float3x3 ViewRotateX = float3x3( UNITY_MATRIX_V._m00, 0, 0, UNITY_MATRIX_V._m10, 1, 0, UNITY_MATRIX_V._m20, 0, -1// Zの符号を反転して右手系に変換 ); viewPos += mul(ViewRotateX, scaleRotatePos); // ④最後にプロジェクション変換 o.pos = mul(UNITY_MATRIX_P, float4(viewPos, 1)); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } }
躓いた点
シェーダーを使ってビルボードを表現する方法はいくつかの記事で紹介されていますが、
自分の環境で試した時は以下の点で問題がありました。
- 左右反転するとスプライトが消える (SpriteRenderer.flipX、localScaleのどちらの場合でも)
- Prefabなどから複数のスプライトを生成すると表示がガタガタなる
以下は、それぞれの対応方法です。
1. 左右反転するとスプライトが消える
これには以下の宣言の追加が必要でした。
Cull Off参考: https://docs.unity3d.com/ja/2020.2/Manual/SL-CullAndDepth.html
シェーダーのデフォルトの設定では、描画の最適化のためにポリゴンの背面を描画しない設定(カリング)が有効になっているようで、
左右反転させた状態でも描画させるにはこのカリングを無効にする必要があるようでした。2. Prefabなどから複数のスプライトを生成すると表示がガタガタなる
表現が難しいですが、Prefabなどから同じスプライトのインスタンスを複製すると以下のように正しく表示されなくなりました。
(Z座標が0の状態で描画されたり、スプライト同士が重なると正しく描画されない)これは参考にさせていただいた記事上でもよく見ると指定されていたのですが、Tagsに以下の宣言が必要でした。
"DisableBatching" = "True"参考: https://docs.unity3d.com/ja/2018.4/Manual/SL-SubShaderTags.html#:~:text=DisableBatching
- 投稿日:2021-01-23T14:30:16+09:00
Unity:Addressable でコンテンツをダウンロード
Addresablesでコンテンツをサーバからダウンロードする方法
環境
OS macOS 10.15.7
Unity 2019.4.2f1
Addressable 1.16.15
PackageManagerからAdressablesをインストール
WindowメニューからAsset Management->Addressables->Groupsを選択
Create Addressables Settingsをクリック
オブジェクトを配置する。オブジェクトは一度ProjectにドラッグしPrefabにする。この例では「Object」と名前をつけた。
PrefabにしたオブジェクトはHierarchyから削除する。
PrefabはAddressableにチェックを入れる。
カラのGameObjectを生成し、その中に下記のスクリプトを記述する。ここではファイル名を「LoadScript」とした。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; public class LoadScript : MonoBehaviour { public AssetReference reference; // Start is called before the first frame update void Start() { reference.InstantiateAsync(); } }上記のスクリプトのInspecterには下図のようなUIが表示されるので、リモートからロードするPrefabを選択する。
上記のUIがInspectorに表示されない場合は、Project WindowでRefleshする。
AdressableAssetSettingのInspectorでCatalogの設定をおこなう。
Assets>AddresableAssetsDataの中にあるAdressableAssetSettingをクリックしてInspectorを表示する。
「Build Remote Catalog」にチェックを入れる。
「Build Remote Caralog」はRemoteBuildPathを選択。
「LoadPath」はRemoteLodePathを選択。
ここではlocalhostのStandaloneOSXフォルダを参照するようになっている。
LoadPathのURLを変更する際にはWindow>Addressable Management>Addresbles>Profilesを開きRemoteLoadPathのURLを変更する。
リモートサーバにアップするファイルのビルドを行う。
Play Mode ScriptのUse Existing Buildを選択
Build>New Build> Default Build Scriptを選択肢ビルドする。
プロジェクトのフォルダ内にSarverDataフォルダが出来ているはず。
その中にBuildTarget名のフォルダをアプリが参照するディレクトリにコピーする。
macOSの場合httpServerが/Library/WebServer/Documentsを参照するので下記の様になる
最後にアプリをBuild and Runを実行する。
- 投稿日:2021-01-23T04:24:21+09:00
BoltでSwitch文を使う方法【Unity】
UnityのBoltでSwitch文を使う方法
Ver
unity -2018.4
Bolt -1.4.13
(https://assetstore.unity.com/packages/tools/visual-scripting/bolt-163802)目的
- Switch文をBoltで実装する方法を記述
- Boltの日本語記事があまりないから外向けにも書く
ノード作成方法
(BoltのインストールとFlowGraph作成までは省略)
Flow Graph上で
右クリック→(「Add Unit...」→)「Control」→「Switch on ~」を選択デフォルトのBoltでは
- Switch on Integer
- Switch on String
- Switch on Enum
が存在しますcaseを増やす方法
(例はSwitch on Integerですが、Switch on Stringも同様です)
初期ノードの出力先(Output)は「Default」のみとなっています
これを増やすためFlowGraph上の「Switch on Integer」をクリック
左側のGraph InspectorのOption下部の「+」をクリック
(※FlowGraphのタブが小さいと表示されないため注意!!!!!!!)(オマケ)Switch on Enumについて
現在VerではenumをInspector上では作成できないみたいです(スクリプトを書いて作るしかないらしいです。未試行)
ただ、Boltに備え付きの列挙型があるので、そこから選ぶのでも事足りるかと思います
用途に合わせてSwitch on EnumのOptionから選びます
- Value type(変数の型によって遷移先を変える)
- Mouse Button(マウスの右クリ左クリのどこを押されたかで遷移先を変える)
- Read Status(ファイル入出力の状況で遷移先を変えられる)
など、コードが書けなくても十分使えそうです!