20210123のUnityに関する記事は4件です。

【Instantiate関数】銃弾の向きが正しい状態で発射する【テンプレスクリプト】

プレファブで弾を発射する

銃口(Muzzle)から弾(bullet)のクローンが発射される

  • 下記Muzzle.csをMuzzleオブジェクト(銃口)へアタッチすることによって、プレファブ化されたbullet(弾)を発射することができます。
Muzzle.cs
using 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);
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityのビルボードシェーダーを実装する際に躓いた点と改善方法

概要

Unityで以下のようにカメラを傾けてもスプライトが正面を向いた状態(ビルボード)を作りたくなり、
調べていたところシェーダーを使ってビルボード表示が出来るということで、
幾つかのサイトを参考に試してみました。
(カメラのprojectionをorthographicにするだけだと正面は向いても傾けた分だけ縦横比が崩れてしまいうまく行きませんでした)

試したところいくつかの記事の内容を組み合わせることで実現出来たため、
躓いた点と解消方法をまとめます。

※Unityを使用してこのような2.5D風(くにお君、River city ransom風?)の表現をするのにこういった方法が
 合っているか分かっていない状態です。この他に良い実現方法があれば教えていただきたいです...。

エディタ上の表示 実行中(カメラが30度傾いている)
image.png image.png

最終的に使用したスクリプト

現在使用しているスクリプトは以下の通りです。

座標変換は以下の記事を参考にさせていただきました。
* 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
        }
    }
}


躓いた点

シェーダーを使ってビルボードを表現する方法はいくつかの記事で紹介されていますが、
自分の環境で試した時は以下の点で問題がありました。

  1. 左右反転するとスプライトが消える (SpriteRenderer.flipX、localScaleのどちらの場合でも)
  2. Prefabなどから複数のスプライトを生成すると表示がガタガタなる

以下は、それぞれの対応方法です。

1. 左右反転するとスプライトが消える

これには以下の宣言の追加が必要でした。

Cull Off

参考: https://docs.unity3d.com/ja/2020.2/Manual/SL-CullAndDepth.html

シェーダーのデフォルトの設定では、描画の最適化のためにポリゴンの背面を描画しない設定(カリング)が有効になっているようで、
左右反転させた状態でも描画させるにはこのカリングを無効にする必要があるようでした。

2. Prefabなどから複数のスプライトを生成すると表示がガタガタなる

表現が難しいですが、Prefabなどから同じスプライトのインスタンスを複製すると以下のように正しく表示されなくなりました。
(Z座標が0の状態で描画されたり、スプライト同士が重なると正しく描画されない)

enable_batching.gif

これは参考にさせていただいた記事上でもよく見ると指定されていたのですが、Tagsに以下の宣言が必要でした。

"DisableBatching" = "True"

参考: https://docs.unity3d.com/ja/2018.4/Manual/SL-SubShaderTags.html#:~:text=DisableBatching

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity:Addressable でコンテンツをダウンロード

Addresablesでコンテンツをサーバからダウンロードする方法

環境

OS macOS 10.15.7
Unity 2019.4.2f1
Addressable 1.16.15


PackageManagerからAdressablesをインストール

スクリーンショット 2021-01-21 13.52.57.png

WindowメニューからAsset Management->Addressables->Groupsを選択
スクリーンショット 2021-01-21 13.54.11.png

Create Addressables Settingsをクリック
スクリーンショット 2021-01-21 13.54.26.png

オブジェクトを配置する。オブジェクトは一度ProjectにドラッグしPrefabにする。この例では「Object」と名前をつけた。
PrefabにしたオブジェクトはHierarchyから削除する。
PrefabはAddressableにチェックを入れる。
スクリーンショット 2021-01-21 13.59.33.png

カラの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を選択する。
スクリーンショット 2021-01-21 14.04.39.png
上記のUIがInspectorに表示されない場合は、Project WindowでRefleshする。
スクリーンショット 2021-01-21 14.04.21.png

AdressableAssetSettingのInspectorでCatalogの設定をおこなう。
Assets>AddresableAssetsDataの中にあるAdressableAssetSettingをクリックしてInspectorを表示する。
スクリーンショット 2021-01-21 14.27.20.png

「Build Remote Catalog」にチェックを入れる。
「Build Remote Caralog」はRemoteBuildPathを選択。
「LoadPath」はRemoteLodePathを選択。
ここではlocalhostのStandaloneOSXフォルダを参照するようになっている。
スクリーンショット 2021-01-21 14.27.08.png

LoadPathのURLを変更する際にはWindow>Addressable Management>Addresbles>Profilesを開きRemoteLoadPathのURLを変更する。
スクリーンショット 2021-01-22 22.20.10.png
スクリーンショット 2021-01-22 22.16.29.png

リモートサーバにアップするファイルのビルドを行う。
Play Mode ScriptのUse Existing Buildを選択
スクリーンショット 2021-01-21 14.07.52.png
Build>New Build> Default Build Scriptを選択肢ビルドする。
スクリーンショット 2021-01-22 22.24.38.png

プロジェクトのフォルダ内にSarverDataフォルダが出来ているはず。
その中にBuildTarget名のフォルダをアプリが参照するディレクトリにコピーする。
スクリーンショット 2021-01-22 22.28.26.png
macOSの場合httpServerが/Library/WebServer/Documentsを参照するので下記の様になる
スクリーンショット 2021-01-22 22.35.34.png

最後にアプリをBuild and Runを実行する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 ~」を選択

image.png

デフォルトの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のタブが小さいと表示されないため注意!!!!!!!)

image.png

(オマケ)Switch on Enumについて

現在VerではenumをInspector上では作成できないみたいです(スクリプトを書いて作るしかないらしいです。未試行)

ただ、Boltに備え付きの列挙型があるので、そこから選ぶのでも事足りるかと思います
用途に合わせてSwitch on EnumのOptionから選びます

  • Value type(変数の型によって遷移先を変える)
  • Mouse Button(マウスの右クリ左クリのどこを押されたかで遷移先を変える)
  • Read Status(ファイル入出力の状況で遷移先を変えられる)

など、コードが書けなくても十分使えそうです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む