うにty生活

UnityChanを生活させたい

Visual Effect Graphのサンプルを徹底解説 第一弾 - Portal

f:id:tubakihimeLoveHate:20200927175818p:plain

 

どうも、ラブヘイトです。

ここ最近Unity Visual Effect Graph(以下 VFX)にハマっておりまして、様々な動画をみています。

学習のためにも実際にサンプルの中身覗いてみるか!と思い開いた訳ですが......

f:id:tubakihimeLoveHate:20200927180109p:plain


見る気がなくなるノード構成、意味わかりません。見るだけでなく、1からサンプルと同じようにも作ってもみました。

 

もちろん同じように動きましたが、どうしてそうなっているのか、何を意図してそのノード構成になったのか全くわからないので、今回はサンプルVFXについて徹底解剖して行こうかなと思います。最初はPortal!

 

知らないことが多いので、長くなること間違いなし!

 

f:id:tubakihimeLoveHate:20200927181645g:plain
サンプルは以下からダウンロードやクローンできます。

https://github.com/Unity-Technologies/VisualEffectGraph-Samples

 

一応グループ分けされているので、ノードグループごとにどんな役割でどういう計算をしているか、解説していきます。

※リファレンスが存在しない部分は自分が実際に動かしみて、機能を推測している部分もあります。

 

 

環境

Unity 2019.3.3f1

HDRP 7.3.1

Visual Effect Graph 7.3.1

 

Wobby Outline

f:id:tubakihimeLoveHate:20200927185127p:plain

このグループの出力は最終的に、Initialize Particle>Add Position from Map>Sample Positionに繋がります

f:id:tubakihimeLoveHate:20200927185157p:plain
 

Add Position from Map

Wobbly Outlineを説明する前に、最終接続先である曲者Add Position from Mapについて説明します。

まずこちらノードは検索で出てきません。Set Position from Mapを作成し、InspectorのCompositionをAddに変更することでノード名が変化します。

 

Add Position NodeはSetしたPositionに位置情報を加算します。

Add Positionを行うと何も設定していなくても、Torusから外れた位置に加算されてしまいます。

f:id:tubakihimeLoveHate:20200927183638p:plain

 

Value Biasを「-0.5」に統一するとSetしたPositionの位置に表示されるので、

Add Posisionで必ず初手に行う設定になります。(わかるか!)

 

そして本題のWobbly Outlineグループが最終的に何をしたいかと言うと、アニメーションした先の、円のアウトラインを歪める表現を行っています。

f:id:tubakihimeLoveHate:20200927184159p:plain

※わかりやすく別の効果は切ってあります。

 

Wobbly Outline(計算)

それではやっとWobbly Outlineの中身についてです。上下に分けて説明します。

上2つのノードはパーティクルのPositionと0.34をMultply。0.34はアウトラインの歪み具合なので、この値を増減させることで歪み幅を調節できます。

 

動的に値が変化するノードはTotal time。これによってアニメーションが実現可能です。

Total Timeはパーティクルごとのデルタタイムで変化していくノード。

Vector3[0,-1,0]の部分で、y軸のみ変化させるように設定しています。

 

つまりこのグループノードが示していることは、現在のPositionとTotal timeを掛け合わせ、Add Position>Sample Positionに接続すると揺れるアニメーションができると言うことです。調節で多くのノードを配置しているだけで、ほぼ同じ表現をするのに最低限必要なノードはこれだけです。

f:id:tubakihimeLoveHate:20200927185512p:plain

音ゲーのエフェクトとかに使えそうですね

 

Source Torus

f:id:tubakihimeLoveHate:20200927185837p:plain

Initialize Particle>Arc Torusに遠くから接続されているSource Torusというノードが存在します。これは正しくは、Arc Torusノードで、Sorce Torusと名前を付けたプロパティです。

Torusの半径や位置を簡単にInspectorから編集するためにこのような接続方法になっています。

 

Compose Initial Brighness(into Color)

f:id:tubakihimeLoveHate:20200927190049p:plain

これはNodeグループというかただのCurveですが、気になるのはグループのタイトル

初期輝度という意味なので、つまりHDR。

接続先がSet Colorなので、やっていることはわかりますが、その接続方法だけでHDRだけを制御できるの?って話です。

 

試しにSet ColorにfloatとVector3で入力型を変更してみました。

f:id:tubakihimeLoveHate:20200927190445p:plain

f:id:tubakihimeLoveHate:20200927190502p:plain


入力がfloatなら、輝度のみ。Vector3なら色を制御できるみたいです。

これはなんとなく予想できたけど、やっぱり入力型で役割違うのか!奥が深い!

 

 

Compose Velocity(ベクトルの大きさ)

f:id:tubakihimeLoveHate:20200927201519p:plain

このノードグループは様々なノード出力の接続先になっていて一見複雑そうに見えますが、

多分計算ノードが多いからそう見えるだけだなと思います。

Velocityの要素は2つに分けることができて、方向と大きさに分けることができます。この2つを分けて説明していきます。

 

まずはベクトルの大きさを決めているノードから

Random Numberはその名の通り指定した最小最大の中でランダムな値を出力します。

サンプルでは0.8から2.0の間で速さをランダムで出力しているので、大きく飛び散るもの、小さく飛び散るものがあっていい感じです。

 

以下Random Number[0.8,2.0](左)と[2.0,2.0](右)で比較した時の画像です。

エフェクトはランダム性があるほどいいですよね。

f:id:tubakihimeLoveHate:20200927202433p:plain


次、Sample Curve>Timeに他のグループから接続されているので、Timeの値によってベクトルの大きさが変化していきます。

ここで一旦Compose Velocityの他の要素は置いといて、Sample Curve>Timeへの接続元である、Pulse rotation Maskグループから解明していこうと思います。

 

Pulse rotation Mask

f:id:tubakihimeLoveHate:20200927203000p:plain

 

Rectangular to Polar

Rectangular to Polarノードはxとyから極座標を求めます。

極座標とはr(動径)とシータ(θ)で点の位置を表す座標です。サンプルでは最終的にシータのみ扱ってます。Angle on TorusグループではTimeとSpeedを掛け合わせてるだけなので、

Remapノードまでを式に表すとこんな感じでしょうか(多分あってると思います)

{(Time * Speed+xθ) % 2π}/2π

Moduloノードは余りを出力するのですが、正直計算式をみても意図が読み取れませんでしたが、θが変化した時の値を追っていくと

 

θ° (θ%2π)/2π
69 0.98
70 0.14
71 0.3
72 0.459
73 0.618
74 0.777
75 0.936
76 0.095
77 0.254
78 0.414
79 0.573
80 0.732
81 0.891
82 0.057

 

グラフにしたら以下のようになります。

f:id:tubakihimeLoveHate:20200925033733p:plain

このグラフとパルスというグループ名から、円周用パルス信号だと推測しました。

3°ごとにVelocityの大きさが最大になるということがわかります。

 

ただ、Shader GraphみたいにWaveノードがあればこんなに複雑にならないのでは?と思いましたが、VFXの方には実装されていないみたいです。

 

Particle-To-Center Vector(World)

f:id:tubakihimeLoveHate:20200927234138p:plain

このグループでは円の中心とパーティクル座標の差をオフセットとして取得しています。

出力はRectangular to Polarノードに接続されています。

これで、velocityのベクトルの大きさを決定するノード解説は終わりました。

次はベクトルの向きです。

 

Compose Velocity(ベクトル向き)

f:id:tubakihimeLoveHate:20200927234646p:plain

またCompose Velocityに戻って、力の加わる向きについて追っていこうと思います。

ノード内でいうと黄色の接続がVectorなので黄色線を追うとわかりやすいです。

このグループノードではAddしているだけなので、一旦置いときます。

 

一旦Vectorノードに置き換えている理由は、グループにした時にわかりやすくするためだと思います。

 

Expel Particles on Z Axis based on Wobbly offset

f:id:tubakihimeLoveHate:20200927234925p:plain

このグループはパーティクルのローカルZ軸に力を加えます。横からPortalを見て、接続を外してみるとわかります。

f:id:tubakihimeLoveHate:20200927235242p:plain

ただ、Change Spaceノードでワールドからローカルに変更している意図はわかりませんでした。あってもなくても変化は見られない......。グループ名もよくわかりません。

ここではChange SpaceノードでWorld to Localが出来ることを覚えていればいいでしょう。

 

Get Torus Tangent

円の接線を取得するノードグループです。

Cross Product

2つのベクトルのベクトル積を計算します。私も詳しいことは知りません。さっき調べました。

Cross ProductからNormalizeノードでなぜ円の接線が取得できるのか、わかりやすく円周上の4つのポイントで考えていきます。

 

前提は以下です

Torusの中心:(0, 1.07, 0)

TorusのMajor Radius:1

f:id:tubakihimeLoveHate:20200928014254p:plain


このようにどの位置にいてもベクトルが円の接線上にあることがわかります。これ再現できる人すごいな.......

方向を逆にするにはCross Productを(0, 0, -1)にすればいいと思います。

 

Random Numberはベクトルの大きさを調節できます。Compose VelocityグループのRandom Numberとの違いはよくわからなかったです。

 

この接線上のベクトルは次のRandomize tangentグループに渡されます。

 

 

Randomize tangent

f:id:tubakihimeLoveHate:20200928004222p:plain

このノードグループで、先ほど求めた接線上のベクトル方向をランダムに傾けています。

 

Rotate 3D

Position:velocityを入れます

Rotation Center:TorusのCenter

Rotation Axis:回転させる軸です。(サンプルではZ軸回転)

Angle :Rotateさせる量

傾け方もランダムになっています。 

 

ここまできてようやくVelocityが終わりました、あと少しです。

 

Categorize Particles/Height Mask

f:id:tubakihimeLoveHate:20200928004501p:plain

f:id:tubakihimeLoveHate:20200928004521p:plain 

ここで行っていることはHeight Mask(高さの閾値)を設定して、一定以上の高さでパーティクルの生存時間を分岐させています。一定以上と言っているもののRandom Number多用してて閾値の実態が掴めないところがなんともわかりづらいです。

 

Noise Intensity over Life and elevation

f:id:tubakihimeLoveHate:20200928004657p:plain

Lifetimeの後半で大きく力が加わるようになっています。ここでもHeight Maskから値を取得しています。

 

Cancel Gravity

f:id:tubakihimeLoveHate:20200928004824p:plain

Gravityを切っていたので忘れていました。このグループでは、particleのY軸が0.02より大きい時は重力を与え、そうでない時は0にしています。ポータルの下部は重力の影響を受けていません。

 

その他ノード

あとはコンテキスト内のなんだこれって思ったノードを調べます。

 

Set Mass Random

f:id:tubakihimeLoveHate:20200928005756p:plain

リファレンスには載ってなかったです。MassはRigidbodyで出てくる質量のことなので、パーティクル一つ一つの質量をランダムにしているという推測です。

 

Linear Drag

f:id:tubakihimeLoveHate:20200928005821p:plain

オブジェクトの移動による物理計算を考慮するかどうかです。普通のパーティクルでもそんな設定項目があった気がします。

比較も作成したのですが、VFXはgifで載せるとわかりづらいのでやめときます。

 

Orient Along Velocity

f:id:tubakihimeLoveHate:20200928010157p:plain

意外と大切なノードで、Velocityの方向にParticleを引き伸ばしてレンダリングします。

このノードがないと結構ダサいことになります。

f:id:tubakihimeLoveHate:20200928010323p:plain

 

まとめ

色々調べた結果、ノードリファレンスはVisual effect graph 7.0以降更新させてないみたいです。なのでそれ以降に追加されたノードは公式の説明がない状態でわからないことも多いです。

 

学べることは多かったですが、文量も多いので第2弾やるかは微妙なところ

早く自分で色々作れるようになりたいぜ!

 

一番最初に添付した画像ですが、ポータルの中身をShader Graphと組み合わせて歪ませてみました。あとはポータルの中に違う風景を映し込めたら最高ですね!

f:id:tubakihimeLoveHate:20200927175818p:plain

 

HDRPで歪ませるShader Graphを作成する方法はこちら

【Shader Graphに入門してみた】HDRPで歪み表現 3日目 - うにty生活

 

今回最長です。5500文字、頑張った。

それではまた

 

 

【Unity VFX】滞留して最後に散るかっこいい演出 #33

 

f:id:tubakihimeLoveHate:20201019071509p:plain

今回はUnityのVFXやっていきます。

先週くらいに初めてVFX触りはじめて、Shader GraphやらVFXやら今更感はあります。

けど公開されてすぐだと仕様決まっていないことが多いので、執筆した項目もうないじゃんってこともよくあります。だからちょうどいいのかなっていう言い訳です

 

先に完成品見せます。

スッと消えていくカッチョいいUnityロゴを作成しました!

Efectは適当にいじっててもそれっぽくなるので、ポイントだけ押さえて説明していきます。

 

環境

Windows10

HDRP 7.4.1

VFX 7.4.1

GPU NVIDIA GeForce GTX 1650 4GB

VFXはGPUで動くらしいので、GPUも載せときます。そんなにたいしたやつではないです

 

作成したいもの

今回作成するものは以下の表現を組み合わせています。自分のやりたい表現があれば是非見ていってください。

・ エフェクトをメッシュの形にする

・遷移していく色

・滞留させて最後に散るエフェクト

 

エフェクトをメッシュの形にする

エフェクトをメッシュの形にするための準備は以下の2つです。

・メッシュを用意する

・PointCacheAssetを用意する

 

今回用意したメッシュはこちら

f:id:tubakihimeLoveHate:20200905134052p:plain

 

Unityのロゴです!

 

VFX Graphでエフェクトをメッシュの形状にするには、PointCaheノードを利用します

f:id:tubakihimeLoveHate:20200905134538p:plain

 

次にノードにアタッチするための、PointCacheAssetを準備する必要があります。

PointCacheはメッシュの法線や位置情報をTextureにベイクしたものです Window>Visual Effects >Utilities > Point Cache Bake Tool

f:id:tubakihimeLoveHate:20200905170651p:plain

 

pCache Toolで、チェックボックスは法線、位置、色を取得するかどうか

今回は法線だけでいいので、Normalだけにチェック。

 

Point Countで頂点数を決めることができます。pCacheでは元々のメッシュの頂点数は関係ありません。ここのcountで決めた頂点数でエフェクトを均等配置します。メッシュをアタッチしたら、セーブして完了。(メッシュをアタッチしないとセーブボタンは出てきません)

f:id:tubakihimeLoveHate:20200905170546p:plain

 

今回は用意されている、ビルドインエフェクトを元に作成していきます。

右クリック>CreateNodeまたはスペースを押すとノードを作成することができるのでSimple Swam Particle Systemを選択

 

再生するとこんなエフェクトが出てくるので、これをカスタマイズしていきます。

 

まず最初にエフェクトをメッシュの形にしていきます。

元々Initialize Particleに存在するPosition(Sphere)を削除して、Set Position from Mapノードを生成。

外にPointCacheノードを配置したら、先ほど作成したPointCacheAssetを割り当てます。

PointCacheノードSet Position from MapのAttribute Mapを繋げます。

f:id:tubakihimeLoveHate:20200905174008p:plain


Gameを再生すると、これだけでメッシュの形になりました!簡単だ!

Turbulence(後述)が激しくてわかりにくいと思うので、Intensityを0.1くらいにすれば形が確認できます。

f:id:tubakihimeLoveHate:20200905174257p:plain

 

 

色を変化させる

Outputにノードを追加します。

Set Color over Lifeを使用

f:id:tubakihimeLoveHate:20200905174617p:plain

f:id:tubakihimeLoveHate:20200905174721p:plain

これはカラーを左から右に徐々に遷移させていくのに使います。

 

Set Color Random from Gradient

f:id:tubakihimeLoveHate:20200905174752p:plain
こっちはピッカーの中でランダムな部分が選択されます。

色ノードは人によって好みが違うので、自身で色々カスタマイズしてみてください。

 

ランダムに動かす・滞留させる

ランダムに動かす部分と最後に散って消える演出は同じノードで行っています。mark

既に存在する、codeUpdate ParticleのTurbulenceノードを調節します

f:id:tubakihimeLoveHate:20200905180322p:plain

 

Turbulenceノード

f:id:tubakihimeLoveHate:20200905222024p:plain

Turbulenceは乱気流という意味で、決まった数式によってランダム風な乱気流を再現します。

乱気流はシュミレートされているので、ランダムではありません。

Positionの中にランダムな値を入れてやることによって、完全に同じ乱気流ができるのを防ぎます。

 

Turbulenceノードにはよくわからないパラメーターが多いですが、これはパーリンノイズというノイズの生成時に利用するパラメーターなので、今回説明は省略して以下に設定のみ表示します。 

 

Intensityは乱気流のスケールで、値が大きいほど、大きく動きます。

今回は最後までメッシュの形状を残しておきたいので、Intensityはずっとゼロ推移させて

最後だけ大きくすることで滞留を表現できますよね?

 

以下のノードを組み合わせます。

・Intensityのプロパティ

・Age Over Life Time

・Sample Curve

・Multiply

f:id:tubakihimeLoveHate:20200905223109p:plain

 

Curveの途中、0付近のプラスマイナスをウェーブさせることで波打つように揺れます。

そして、最後にグン!っとあげると滞留&散る演出の完成です。

f:id:tubakihimeLoveHate:20200905223339p:plain

 

この方法、先日Unityステーションの「VFX Graphで何か作ろう」っていう動画内で同じ方法でやってるのを見つけて驚きました。

この組み方は、公式も使ってるし色んなところで応用が効くのでおすすめです。

 

その他設定は以下のとおり

Scale 0.5 0.5 0.5

Dragは調節できるようPropertyに

Octaves = 1

Frequency = 1

Roughness = 0.5

Lacunarity = 1

 

最後にすっと消えて欲しいのでalfa over lifetimeノードを追加します。

カーブはこんな感じ

f:id:tubakihimeLoveHate:20200905224819p:plain

 

最後に完成したノードを全て載せておきます

f:id:tubakihimeLoveHate:20200905230126p:plain

f:id:tubakihimeLoveHate:20200905230121p:plain

f:id:tubakihimeLoveHate:20200905230130p:plain

f:id:tubakihimeLoveHate:20200905230133p:plain

 

まとめ

今回できるようになったこと

エフェクトをメッシュの形にすること

色の遷移

滞留&時間による変化

 

短時間でこんなクオリティのものが簡単に!ノードベース最高!

今回初めてyoutebeの埋め込み機能付けてみました、またブログの読みやすさも変わったかな?

 

というところで今回はここまで

それではまた

 

【Shader Graphに入門しました】衝突検知とフレネル 2日目

 

f:id:tubakihimeLoveHate:20200822131034p:plain

 

Unityできるって聞いて会社入ったのにずっとWebアプリしてます。

ラブヘイトです

 

1日目  > 2日目←イマココ

前回(1日目)の記事でShader Graphの基礎的な操作は押さえたので、今回はyoutubeのShader Graph動画で実際に手を動かして、Shader Graphに慣れよう!という記事です

動画要約とか実際に同じものを作成していきます

 

 

自分の環境

Unity 2019.4.0f1

HDRP 7.4.1

Shader Graph 7.4.1

 

エフェクト作成のために知っておきたい Shader Graphの話

 

この動画で作成するShader

シールドとか、竜巻Shader

f:id:tubakihimeLoveHate:20200803231530p:plain

以下の表現ごとに分割して説明があったので、自分の目指す表現がいずれかに当てはまるならこの動画を見ることを強くお勧めします!

シールド

・衝突検知

・フレネル

・UVスクロール

・歪み表現

※当記事では、動画で扱わなかったFlesnel Efect Nodeも説明します

   歪み表現は別の記事で扱います。

→ちょっと待ってね

竜巻

・頂点アニメーション

・パーティクル設定

・U Vスクロール

・ノイズテクスチャアニメーション

※当記事で竜巻は実際に作成しません

 実際に作ってみた

実際にシールドの衝突検知、フレネル、UVスクロールまでを作成してみました。

f:id:tubakihimeLoveHate:20200812155226p:plain

 

作成手順は動画の通りなので、1からの説明はしませんが頻繁に使用しそうなノードや

動画内で名前だけ登場したけど使わなかったノードを掘り下げて紹介していきます。 

 

ポイント整理

衝突検知

深度にアクセスするには

Scene Depthを利用

f:id:tubakihimeLoveHate:20200822152542p:plain

 

Screen Positionのwとは?

f:id:tubakihimeLoveHate:20200822150859p:plain

ここのノードの部分で説明がありました。Splitノードの出力はRGBAなので分かりづらいですが、vecter4をRGBAに入れたときは(R:x,G:y,B:z,A:w)という風に格納されます。

なのでSubtractノードに入れているのは透明度(アルファ)ではなくベクトルのw(距離)になります。

 

最初早すぎてこの部分は何をしているのかわからなかったのですが、もう一度見直したらちゃんと説明されていました。

 

 

Smoothstepノード

動画内では、このSmoothStepノードを衝突箇所の幅周辺をグラデーションっぽくする(白と黒の間を滑らかにする)ために利用していました。

下記のようなカーブで計算を行うノードです。

※Edgeオプションはsmoothにする範囲を設定する。

f:id:tubakihimeLoveHate:20200804005429p:plain 

 

f:id:tubakihimeLoveHate:20200822155329p:plain

 

フレネル

フレネルというのはサーフェスに対して垂直に入射すると反射が少なく、平行になるほど強く反射する効果です。

この効果を使えば何ができるかというと、輪郭付近のみに作用する効果を入れたり水のような表現が可能です。とにかく表現方法として覚えといて損はないです!

 

動画では

Fresnelを作成するためにはFresnel Efectノードというのが便利(動画では名前のみ)

と紹介されていて動画中名前だけしか登場しません。なので動画で作成するフレネルShaderの部分をFresnel Efectノードに入れ替えてみました。

 

動画内で紹介された、Fresnel Efect

f:id:tubakihimeLoveHate:20200812144838p:plain

 

Fresnel Efectノードのコードを見ましたが、動画でわざわざ行っていたnormalizeや法線、View Directionの取得も、指定がなければ勝手にやってくれてるようなのでFresnal Efectノードだけ配置してみた。

 

Fesnel Efect Nodeのみ配置

f:id:tubakihimeLoveHate:20200812145922p:plain

こんなに簡単にできるならこれでよくね?.....と思いましたが

 

実際表示してみると裏側が塗りつぶされるみたいです。

←左 Transparent-Two SidedでFresnel Efectのみ 動画内での完成形 右→

f:id:tubakihimeLoveHate:20200812153438p:plain

 

調べてみると「Transparent  x  Two Sided」ではFresnel Efectはうまくいかないという記事がありました。

同じ動画を見て同じところでハマってました。

Shader Graphの超入門レシピ その7~輪郭を明るくする2つの方法~ - さわぐちFMオキーステーション

 

Two Sidedを外してみたところ

f:id:tubakihimeLoveHate:20200812153516p:plain

 

よくはなりましたが、やっぱりTwo Sidedを外してしまうと後ろの輪郭がなくなってしまうのでやっぱり今回の表現は動画の通りにしたほうがいいですね。

なので、どちらかというとFresnel Efectを利用するのが普通で今回はうまくいかなかったから特別なノードの組み方をしたってことだと思います(憶&測)

 

UVスクロール

Tile and OffsetとTimeノードでUVスクロール

結構多用しそうなので紹介

f:id:tubakihimeLoveHate:20200812154851g:plain

 

One Minus・Subtract

f:id:tubakihimeLoveHate:20200822155654p:plain   f:id:tubakihimeLoveHate:20200822155658p:plain

動画内で作成するShaderで、当たり前のようにOneMinusノードやSubtractノードで1や0.5からマイナスすることが度々あります。1から引くことでグレースケールを反転させることができます。基本的に表示されたり効果を持たせたい部分を白で表現するので、これらをコントロールするためにはかなり重要だと思いました。

 

作成中困ったこと

困ったことを書いていきます

途中、何も映らなる問題に遭遇しました。

これはMasterのAlphaClipThresholdが1に設定されて、全てのAlpha値を破棄していたためです。(0に変更)

AlphaClipThresholdは、アルファ値を持つノードを破棄するための閾値

f:id:tubakihimeLoveHate:20200812160803p:plain
 

完成

f:id:tubakihimeLoveHate:20200812161859g:plain
 

HDRP環境での歪み表現は、動画とは違う方法で実装したので別の記事で紹介したいと思います

【Shader Graphに入門してみた】HDRPで歪み表現 3日目 - うにty生活

 

また、竜巻のShaderはUV展開という難所があり、UV展開などほぼやったことがなく

以下のポイントがわからなかったので今回竜巻を実際に作成するのは断念

・Blenderの自動UV展開の挙動が謎(シームは付けてる)

・手動でUV展開する方法がわからん

・Unityに持ってきた時にどうやってUVTextureとメッシュをどうやって紐付けてる?

 

ここら辺もUV展開でまとめて別の記事にしようと思います

→かなり待ってね

  

まとめ

今回できるようになったこと

・透明と不透明オブジェクトの衝突検知

・フレネル効果

・UVスクロール

・効果の掛け合わせ

・効果範囲の反転や調節

 

使えるようになったノード

・Time

・Split

・Tilling And Offset

・Normal Vector

・View Direction

・Screen Position

・Screen Depth

・Smoothstep

・Multply、Add、Blend

※竜巻と計算系のノード抜き

 

今回見たコンテンツは40分くらいなのにてんこ盛り!丁寧で分かりやすいし、様々なノードを使ってくれていたので、この動画を見るだけでShader Graphの基礎が身に付く内容でした。ありがとうございます!

 

Shader作成で大切なことは表現ごとに分けて考えることだなと感じた!

分けて考えることで、やるべきことがかなり明確になりました。

 

あとは想像力を働かせて自分で色々やってみるしかないですね!

 

ではまた!

Shader Graphに入門しました 基本操作 1日目

 

f:id:tubakihimeLoveHate:20200816222538j:plain

 

Shader Graphで〇〇作ってみた!って記事を出そうと思ったら

案外Shader Graphに苦戦しまして、記事にまとめながら学習していくことにしました

ラブヘイトです。

 

全く初めてShader Graphを触るんだ!って人向けです。私もそうなので共に頑張っていきましょう!

Unity自体初めという方にはお勧めしません。各ビューの名前とか、マテリアル、シェーダーの概要を理解できてなければ、まずそちらから調べてみてください。

 

自分の環境

Unity 2019.4.0f1

HDRP 7.4.1

Shader Graph 7.4.1

 

※HDRPかどうかによって作成できるShaderやShader内容が変わるので注意が必要です

当記事では一貫してHDRPで操作を行います 

 

第1回目なので軽めに基本的に操作を押さえていきたいと思います

今回の内容はこちら

 

Shader Graphとは

Shader Graphは今までプログラムで書いていたShaderを、ノードベース(プログラムなし)で作成できる機能です。

 

従来のShader

f:id:tubakihimeLoveHate:20200815220247p:plain

ノードベースのShader(Shader Graph)

f:id:tubakihimeLoveHate:20200815220429p:plain

 

プログラムで記述するメリットもありますが、ノードベースは見て分かりやすいというメリットがありますね。 

 

Shader GraphをInstall

もう既にInstallしている方やHDRPではデフォルトでInstallされているので飛ばしてもらって結構です。

 

Package ManagerからShader Graphを探してInstallします。もし古いバージョンのShader Graphを使っているならチェックしてみてUpdateしましょう。

f:id:tubakihimeLoveHate:20200815220737p:plain

UpdateというボタンがあればInstallできています

 

Shader Graphを作成

Create > Shaderまで遷移したら、「〜〜 Graph」とついているものは全てShader Graphで作成できるShaderです。

 

なんでもいいのですが、今回はUnlit Graphを選択しましょう。

作成完了です。

f:id:tubakihimeLoveHate:20200815220903p:plain

 

MaterialにShaderをアタッチする

作成したShader Graphを選択した状態で、Create > Materialを選択すると、

作成したShaderが選択された状態のMaterialが作成されます。

f:id:tubakihimeLoveHate:20200815221154p:plain

f:id:tubakihimeLoveHate:20200815221157p:plain

 

一応あとから、MaterialにShaderをアタッチすることもできて

MaterialのShaderから選択するか、MaterialにShaderをドロップすればOK

 

簡単なShaderの作成方法

先ほど作成したShaderをダブルクリックするかOpen Shader Editorを選択すれば、編集ウィンドウが出てきます。最初の画面がこちら↓

f:id:tubakihimeLoveHate:20200816153344p:plain
右上に表示されるのが、プレビュー画面Window。

左上に表示されているのがBlack board。

それ以外の空いているスペースにノードを配置していきます。

 

Node作成方法

ノードを作成する方法は4つもあります!(もっとあるかも?)

・右クリック > Create node

Create nodeは全てのノード一覧が表示されます

 

f:id:tubakihimeLoveHate:20200816160645p:plain

 

・Textureなら空白のスペースにD&Dで作成可能

f:id:tubakihimeLoveHate:20200816160833p:plain



・nodeの出力または入力先を空白のスペースにDragすると検索候補が出てくる

こちらはCreate nodeの時と同じ検索画面が出てきますが、右クリックから表示させた時とは違い、ドラッグ元の入出力の型に合う候補のみ出てきます。

f:id:tubakihimeLoveHate:20200816161949p:plain

 

・Spaceで即検索&配置、ノードはカーソル位置に出現します

Create node一覧がすぐに表示されます

 

よく使うのは後ろ2つでしょうか、ノードを素早く組み立ててるとかっこいいですよね

 

 

色をつける

今回の目標

マテリアルに色を付けてInspector上で簡単に透明度を変えられるShader

 

これを作成したいので、まずはUnlit Masterの横にある歯車マークを押してSurfaceをTransparentに変更します。

 

他の基本的なShader設定はここから変更可能です。(今回はSurfaceだけ)

f:id:tubakihimeLoveHate:20200816162940p:plain

 

その次にCreate nodeからColor Nodeを選択して、MasterのColorに繋げましょう

f:id:tubakihimeLoveHate:20200816163729p:plain

 

左上のSave Assetを押して保存します。このShaderを選択したMaterialをSphereオブジェクトに適用すると、以下のようになります。

f:id:tubakihimeLoveHate:20200816163929p:plain

 

Propertyを追加する

最後に、MaterialのInspector上からColorを変更できるように、Propertyを追加しましょう。

Shader EditorのBlack boardにNodeを追加することで、MaterialのInspector上から値を変更することが可能になります。


Color Nodeを右クリック>Convert To PropertyでBlack boardに追加します。

Black boardの「+」ボタンを押しても作成することができますが、Convert To Propertyから行った方が簡単です。名前は「_color」にします。

f:id:tubakihimeLoveHate:20200816165020p:plain

 

Save Assetを押して保存するとMaterialのInspectorにColorが表示されます。

これでInstectorから色を変更できるマテリアルが完成しました。

f:id:tubakihimeLoveHate:20200816165512p:plain

f:id:tubakihimeLoveHate:20200816180602g:plain

次にAlpha値もInspectorから変更したいので、Colorと同様にSlider nodeを作成してBlack boardに追加します。

f:id:tubakihimeLoveHate:20200816211036p:plain

 

完成

f:id:tubakihimeLoveHate:20200816211612g:plain

1日目なので基礎となる内容をしっかり押さえておきました。今回の操作はこれからの基礎になっていくのでしっかり覚えていきたいところです。

 

2日目はもういきなり、とある動画を見ながら作成していこうと思ってます。

ではまた次回お会いしましょう

 

 

【HDRP】Subsurface Scatteringをカスタマイズ #32

 

どうも、ラブヘイトです

 

いきなり余談ですが3Dオブジェクトにミラーっていうのが追加されててびっくりしました!

完全な反射ではないですが、これはこれで使えそう!

f:id:tubakihimeLoveHate:20200725212455p:plain

 

さて、今回はUnityをHDRPで利用できるLitシェーダーのSubsurface Scatteringの紹介です。

前回はUnityちゃんに使いましたが、今回は様々な物体に適用してちょっとした絵作りをしていこうかなと思います。

 

HDRPでUnityちゃんを使う方法(SSS設定もあり)はこちら

Unityちゃん!HDPRに引越しだ!【UnityちゃんHDRP移行ガイド】#31 - うにty生活

 

 

環境

Unity 2019.4.0f1

HDRP 7.4.1

 

Subsurface Scattering(SSS)とは

これは表面化散乱を表現できるというすごいシェーダーです!(語彙力&押し売り)

表面化散乱とは

物体の表面下に光が侵入してきたとき、反射しまくって入ってきた場所とは違うところから表面外に出ていくことです。この時に物体が透過したりぼやけたように見えます。

 

なので、SSSを利用するとより本物の肌に近づけることができます。

もっと詳しく知りたい方はこちらの記事がわかりやすかったです

基礎からはじめる物理ベースレンダリング - Qiita

 

こんな絵が作れる!

SSSを適用するとこんな絵作りが簡単にできます。

f:id:tubakihimeLoveHate:20200726110744p:plain

全て無料のアセットとHDRPでできてます。

 

SSSを適用するための準備

LitシェーダーのMaterial TypeをSSSにするだけでは、SSSは適用されません。

少し準備が必要です。

1. SSSを有効にする

Asset > HDRenderPipline > Material > Subsurface Scatteringにチェック

2019.4.0f1ではプロジェクトウィンドウのAssets > Setting > HDRenderPipelineAsset

のMaterialに移行されています

 

f:id:tubakihimeLoveHate:20200725220310p:plain

 

2. Litシェーダー にDiffusion Profileを設定

Diffusion Profileの詳細については後述します。

今回はこのDiffusion Profileをカスタマイズしていくのですが、今はとりあえず準備だけ

Create > Rendering > diffusion Profileで作成します。

f:id:tubakihimeLoveHate:20200725215511p:plain

 

3. Diffusion Profileを登録

Diffusion Profileはあらかじめ登録したものしか使うことができないので

Asset > HDRenderPipline > Material > Diffusion Profile List から「+」を押して先ほど作成したProfileを登録します。これで準備完了

 

※こちらも現在はAssets > Setting > HDRenderPipeline > Material > Diffusion Profile List

また2019.4.0f1ではDiffusion Profile作成したら勝手に追加されていました

 

 

Diffusion Profile作成

では蝶用に先ほど作成したDiffusion Profileをカスタマイズしていきます。

f:id:tubakihimeLoveHate:20200725220602p:plain

 

Scattering Distance

滲み色とぼかし半径を選択する項目

カラーピッカーで色を、Intensityで光が表面下(surface下)を移動する距離を設定します

f:id:tubakihimeLoveHate:20200725220657p:plain

Intensityが高いほどライトがsurface下を長い距離進みます。つまりぼやけて、色が滲む半径が広がります

今回、蝶に関しては元々Base Mapで色がついているので、白色のままIntensityは1.3にします

 

Max Radius

この値は自分では動かせないので、するー

 

Index of Refraction

屈折率を調節できる項目。蝶にも種類があるので正しい屈折率はわかりませんが、見つけた物だと1.56くらいだったのでその値を設定

参考:

http://www2.yukawa.kyoto-u.ac.jp/~atsushi.taruya/research/Morpho_butterfly.pdf

 

World Space

SSSの適用範囲をworldスケールに合わせます。基本的に1でいいです

 

Texturering Mode

HDRPがマテリアルのアルベドを適用するタイミングを選択できます

-Post Scatter

  SSSを適用した後にアルベドテクスチャを適用。アルベドテクスチャがぼやけない

 

-Pre and post scatter

  アルベドテクスチャが、SSSの適用の前後に 2 回適用される。効果的にアルベドがぼやけ、よりソフトで自然になるっぽい

今回はどっちでもいいので、自然っぽくなる後者を選択します。

 

Transmission Mode

- Thick

  厚いオブジェクトの場合に設定

 

-Thine

  薄いDouble-Sidedオブジェクトのための設定

蝶の羽は薄いくてDouble-Sidedを設定しているので、Thineを設定します

 

Transmission tint

オブジェクトを透過する色合いを指定できます。

f:id:tubakihimeLoveHate:20200725222734p:plain

 

f:id:tubakihimeLoveHate:20200725222750p:plain

 

Thickness Remap Values

ジオメトリ厚さの最小、最大値の範囲を設定します。値が低いほど薄いということなので表面下で光が屈折する範囲が広がります。

f:id:tubakihimeLoveHate:20200725223137p:plain

 

この項目は後でMaterialに出てくるThickスライダーに対応してます

f:id:tubakihimeLoveHate:20200725223403p:plain

 

この最小、最大はこのThicknessスライダーの0から1に正規化されます

 

Thickness Remapを0~20にしたときの0と1で比較します

Thick=0、Thickness Remap Values = 0

f:id:tubakihimeLoveHate:20200725224848p:plain

 

Thick=1、Thickness Remap Values = 20

f:id:tubakihimeLoveHate:20200725224852p:plain

 

蝶用のMaterialをセッティング

まず蝶に適用しいきます。使ったアセットはこちら

Butterfly (Animated) | Characters | Unity Asset Store

 

オブジェクトを配置して、そのままのShaderは使えないので

ShaderをHDRP > Lit Shaderに変更

MaterialTypeをSubsurface Scatteringにします。

f:id:tubakihimeLoveHate:20200725235843p:plain

 

BaseMap = butterfly_Albedoテクスチャ

次にSSSのオプション項目であるTransmissionを有効

 

Transmissionを有効にすることでSSSで半透明をシミュレーションできます

これを有効にすることでDiffusion Profileで設定できるTransmission only項目の適用ができます。↓この部分の設定が適用される↓

f:id:tubakihimeLoveHate:20200726004154p:plain


そしてDiffusion Profileに先ほど作成したDiffusion Profileを設定します

 

Subsurface MaskとSubsurface Mask Map

SSSのぼかし効果の強さを0から1で設定できます。

Subsurface Mask Mapを設定している場合はグレースケールのテクスチャを使うことでぼかす場所とぼかさない場所を調節することが可能

テクスチャがない場合はこのぼかし効果は全体に適用されます

今回は全体的にぼかしてみたいので1に設定

 

ここまできたらマテリアルの設定は終わり

色付きのポイントライトを蝶の羽の間に配置して蝶は完了です

 

 

CrystalにSSSを適用

f:id:tubakihimeLoveHate:20200726020647p:plain

アセットはこちらを利用しました

Translucent Crystals | 3D Fantasy | Unity Asset Store

多分本来の使い方としてはEmissionを利用してクリスタル自体を光源にすることができるアセットだと思いますが、今回はEmissionは使いません

 

クリスタルのDiffusion ProfileとMaterial設定は載せておきます。

f:id:tubakihimeLoveHate:20200726020918p:plain

f:id:tubakihimeLoveHate:20200726022329p:plain

 

ただ、クリスタルは薄いオブジェクトではないので光源が届いていない場所はSSSが適用されません

例えば下図はポイントライトをクリスタルの背後に配置していて

クリスタルの左側の結晶にしか光が当たってないので、手前の結晶にはSSSは適用されてないのがわかります

f:id:tubakihimeLoveHate:20200726020647p:plain

 

まあ確かに表面化散乱って光が表面化に侵入して初めて起こる現象なので当然っちゃ当然ですね。

 

最後にPostProcessやParticleやAAを適当に設定して完成。作業はあっという間だったけど文章にすると結構長くなったな

f:id:tubakihimeLoveHate:20200726110626g:plain

本当は波紋とかつけてあげたかったです。

 

ということで今回はナンバリング記事の裏側みたいな感じの記事でした〜

 

 

ジョイスティックでキャラ操作 #28

 

f:id:tubakihimeLoveHate:20191104210147p:plain

どうも、ラブヘイトです

今回はキャラクターUIコントローラーを作成していきます! 

ジョイスティックと言うそうです!

 

 

◆ジョイスティックとは

モバイルアプリとかによくあるキャラクターを操作する擬似スティックコントローラのようなイメージをしています

こんな感じのやつ↓↓

f:id:tubakihimeLoveHate:20191102141706j:plain

f:id:tubakihimeLoveHate:20191102141343p:plain
アーチャー伝説や、荒野行動など

fortniteも多分そうかな?スマホ版はやったことないけど

 

◆準備

・丸い画像を二つ用意

 適当に作ったんで、よかったら使ってください↓

f:id:tubakihimeLoveHate:20191102141859p:plain    f:id:tubakihimeLoveHate:20191102141917p:plain

 

1つはコントローラーの背景用(左)と

もう1つは実際にタップして動かす用(右)です

 

・Canvasを用意

 RenderModeはカメラ越しに写ればなんでも良いです

 

Canvasに関しての過去記事はこちら↓

3DでUIを配置する 操作方法を表示してみた #11 - うにty生活

【まとめ】Canvasを使いこなそうのコーナー #11.1 - うにty生活

 

背景はImageUI、コントローラーはButtonUIとして配置

先ほどの画像をアタッチすればok

f:id:tubakihimeLoveHate:20191102142824p:plain

f:id:tubakihimeLoveHate:20191104204124p:plain

◆IDragHandler

今回はドラッグメソッドを簡単に実装するためのクラス、IDragHandlerを利用します

 

この「I〜Handler」クラスはそれぞれクラスと役割が異なるので

使う分だけ継承する必要があります

・IBeginDragHandler:ドラッグが開始した時を検知

・IDragHandler:ドラッグを検知

・IEndDragHandler:ドラッグの終わりを検知

 

 これらを継承したクラスを、ドラッグさせたいオブジェクト

(今回でいうとコントローラー)にアタッチ ※EventSystemsが必要です

gist9e4fa82ecb0b6182ca264cb01c31f1dc

これだけでもうドラッグ可能です

f:id:tubakihimeLoveHate:20191102200656g:plain

gifだと速すぎてよくわかりませんでしたが、ここまではすぐに試せると思います

あと、ここままでは背景の枠からはみ出てしまうので調節します

◆実装 

とりあえずカメラは追従して欲しいので、過去の記事を参考にしてね!

といったけど私は親切なので、コード載せちゃいます笑

Cameraクラス

gist2d7e45849cfef03b276ea5bc45bd8d72

 

こちらがコントローラーにアタッチするクラスになります

gist02c108b23a3b28b99394392d912587dc

f:id:tubakihimeLoveHate:20191104170722p:plain

PointerEventDataにはdeltaTimeなるものがなかったので、固定で0.1

GetAngle()メソッドは他の人の記事を参考にしました。ありがとうございます

参考:すとーぶろぐさん

【Unity】Mathf.Atan2で取得する角度を上向き0度スタートで時計回りにする【2D】 - すとーぶろぐ

 

過去記事:

カメラ追従+カメラ操作したい #4 - うにty生活

ブレンドツリー使ってみた #17 - うにty生活 ←アニメーションについて

 

コントローラークラスをボタンの方にアタッチして必要な項目を

埋めたら完成です

f:id:tubakihimeLoveHate:20191104134636g:plain

 

毎度のことながら、ここからは応用編

 

◆Drag距離によって速さを変化

 OnDragメソッドでstartPositionと現在のタップ位置とのDistance(距離)を取得しているので、コントローラーの中心からの外側になるにつれて走っていくようにします

ControllerUIのフィールドに追加

private float maxSpeed = 2;
private float minSpeed = 1;

 animator.SetBool("walking",true)以下に登録

//アニメーション
animator.SetBool("walking",true);
if(distance > 40){
     if(pulusSpeed<2)pulusSpeed += 0.1f;
     else pulusSpeed = 2;
}else{
     if(pulusSpeed>1)pulusSpeed -= 0.1f;
     else pulusSpeed = 1;
}
animator.SetFloat("walk_runBlend",(pulusSpeed-minSpeed)/(maxSpeed-minSpeed));

アニメーションを含めないバージョンならこれだけでok

if(distance > 40)pulusSpeed = 2;
else pulusSpeed = 1;

 

◆押した場所から始まるコントローラー

キャラコンのUIはずっと表示していると邪魔なので、押した場所だけに表示したい

まず、Canvasと同じ大きさの透明なImage(Controller_View)を作成して

背景(controller_back)を子にします

f:id:tubakihimeLoveHate:20191104204237p:plain

そして先ほどまでcontrollerにアタッチしていたControllerUIは、Controller_Viewに移動します

 

最終的なコードがこちら

gist2523c951bc51f9d6352d12904b9b76ab

 

f:id:tubakihimeLoveHate:20191104204520p:plain

 

◆完成

 

f:id:tubakihimeLoveHate:20191104210032g:plain
 

 

今回ブログ史上最長かもしれない 

あとGist初めて使ってみました!簡単だし綺麗だし、白目向いちゃう

 

ではまた

 

Unity 3Dオブジェクトの原点は変えられるのか #23.1

  

f:id:tubakihimeLoveHate:20190619013641j:plain

 

どうもラブヘイトです

私のブログ内でこの記事が一番人気だったので、見やすく修正しました!

 

今日は3Dオブジェクトの原点を変える方法についてです

 

 

結果から

先に結果をお伝えすると原点を変える方法は3つあります

 

原点(pivot)を変更したい理由

pivotは中心という意味があり、Unityではオブジェクトの中心のことを指します

オブジェクトはこのpivotを基点として回転したり、オブジェクトの正確な位置はpivotの 場所だったりします。

 

原点を変更したい理由としては、中心以外の場所を軸に回転してほしい!

ってところだと思います

2DからUnityを触り始めた人(私)は

「2Dではpivotグリグリ動かせるのに〜!3Dオブジェクトはpivot変えられないの!?」

とずっと疑問でした

 

残念ながらデフォルトでは好きな軸に回転させたいだとか2Dでは簡単なことも3Dでは出来ないのです、、、

f:id:tubakihimeLoveHate:20190619011547p:plain


もしpivotを動かすことができて、2Dのようにグリグリ動かせたら最高ですよね!

なので pivotを動かす方法をいくつか調査しました

 

コードを作成する

UnityAnswers(←リンク)の質問をいくつか見たところ、Unityのデフォルトの機能ではできないみたいです

コードを書けばできるみたいで、Editor拡張のコードを書いた人のコードを使用させていただきました

http://solvethesystem.wordpress.com/2010/01/15/solving-the-pivot-problem-in-unity/

f:id:tubakihimeLoveHate:20190619011702p:plain
このコードをAsset>Editorフォルダに入れるだけで、

f:id:tubakihimeLoveHate:20190619011749p:plain

こんな風にエディターから原点を編集できちゃいます!

↓↓↓

f:id:tubakihimeLoveHate:20190619011846p:plain

f:id:tubakihimeLoveHate:20190619012221g:plain

ただ、やっぱりUnity上でのpivotの表示は真ん中にあるので、オブジェクトをみた瞬間に理解できなかったり。pivot動かしたのを忘れてたりすると挙動がおかしいと勘違いしてしまうので微妙かもしれない

 

モデリング時に原点を変更しておく

また、こんな意見も、、、

「コードを書くよりも、モデリングの時点で原点考えて作ったほうがいいよ!っていうか、みんなそうしてるよー」

 

例えば郵便ポストみたいな、地面に突き刺す系のオブジェクトは地面との接触箇所を原点にしておくとUnityに持ってきたときも楽ですよね

 

これは多分大体の人が行っている方法だと思います。

 

擬似的に原点を動かす

根本的な解決にはなりませんが、簡単に思い通りの動作をするといえば

やはり空のGameObjectを親にすることですかね!

原点を変えたいオブジェクトを空のGameObjectの子にします。

 

下の図で言うとCubeが原点を変更したいオブジェクトです。

f:id:tubakihimeLoveHate:20190602191532p:plain

 

そして、親のGameObjectのRotationを変更してみてください!

そこが軸となって回転しています 

f:id:tubakihimeLoveHate:20190602191433g:plain

今のところ不具合や変な挙動はしたことがないので、ある程度はこの方法でもいいと思います!

 

前回の記事ではGameObjectを親にする方法で、Unityちゃんに物を持たせてみました

 

 

まとめ

3Dオブジェクトの原点(Pivot)を動かす3つの方法は

・エディター拡張するコードを作成する

・モデリングの時点で原点を決めて作成する

・空のGameObjectで擬似的に再現する

 

以上 

それでは、良い原点ライフを(なんだそれ)

 

 

 

Unityちゃんにスマホ持たせてあげた #23

f:id:tubakihimeLoveHate:20190601140004p:plain


どうもラブヘイトです!

少しづつ家を豪華にしていけたらいいなと思ってオブジェクト作ってます

一人暮らし始めたてみたいな感じですね笑

 

今回はUnityちゃんに物を持たせていきます

 

 

◆オブジェクトの準備

タイトル通りスマホを持たせてあげたいので、用意しました

iphoneXのオリジナルカラーです!もちろんapple非公認です!

f:id:tubakihimeLoveHate:20190601155913p:plain
これもBlenderで作成したものです

 今回はこのスマホをUnityちゃんに持たせていきます

もしこの記事を見ながら進めていくという人はとりあえずCubeで代用してください

 

◆オブジェクトを持たせる

手の動きと一緒にするのは簡単で、持たせたいオブジェクトをUnityちゃんの手の子にすれば完了です

f:id:tubakihimeLoveHate:20190601195453p:plain

◆位置調節

位置を調整します

f:id:tubakihimeLoveHate:20190601195441p:plain

 

毎回位置を合わせるのは面倒なので、後ほどスクリプトにしていきます

◆ポイント

手の子にした時には自動で持ち物オブジェクトの原点を掴むような形になるので、銃や武器などをそのまま持たせた場合は原点(中心)を持ってしまいます

 

回避方法としては

オブジェクトを作る際、持つ位置を原点にして作成する。もしくは

Unity側で簡単にできるのは1つGameObject挟むことです

handmesh

  |__GameObject

                   |___iphoneX(持たせたいもの)

 

どちらにせよ、後者の方法だと手を動かさなくてもiphoneを自在に動かすことができて他のものも持たせられるので汎用的です

f:id:tubakihimeLoveHate:20190602191433g:plain

f:id:tubakihimeLoveHate:20190602191532p:plain

原点の表示がおかしいですが、このようにGameobjectが原点となって棒を回転させることが可能になっています。RectTransformの擬似pivotみたいな役割をしてくれてます

◆スクリプト作成

スクリプトの前に準備が2つあります

1つ目の準備はまずScene上で一度iphoneXを持たせていい感じに調節します

f:id:tubakihimeLoveHate:20190602193048p:plain

2つ目に調節し終わったiphoneをprefabとして

”Resources/Prefab/”フォルダに置いておきます

f:id:tubakihimeLoveHate:20190602194826p:plain

 

なぜかというと、スケールは持たせたいオブジェクトによって違うからです。本来以下のスクリプトでInstantiateをした場合スケールを設定しなければいけませんが、最初の準備でiphoneXPrefabにスケールが設定されているため書かなくて良いのです

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

public class hand : MonoBehaviour {
 
  //手のオブジェクトを設定
    public GameObject targethand;
    public Vector3 offset;
  //調節用
    [SerializeField]
    float controlX = 90;
    [SerializeField]
    float controlY;
    [SerializeField]
    float controlZ;

    private string path = "Prefab/iphoneX";

    // Use this for initialization
    void Start () {
        offset = new Vector3(controlX,controlY,controlZ);
        HoldInHand();
    }
    
    // Update is called once per frame
    void Update () {
        
    }

    public void HoldInHand(string path=""){
        GameObject obj = Instantiate(Resources.Load<GameObject>(this.path),targethand.transform);
        obj.transform.SetParent(targethand.transform);
        obj.transform.eulerAngles = offset;
    }
}

◆他にも色々

f:id:tubakihimeLoveHate:20190602183712p:plain

こんな風に細長いものも持たせられるようになったので、あとあと武器やら追加した時でもすぐに持たせることができます!

 

◆自撮りUnityちゃん

f:id:tubakihimeLoveHate:20190602183334p:plain

 

を、撮る私笑

f:id:tubakihimeLoveHate:20190602183516p:plain

 

ということで今回は以上です

 

 

【Unity】Skyboxを自分で作成 #21

 

f:id:tubakihimeLoveHate:20190512022131p:plain


どうもラブヘイトです!

せっかくの10連休だったけどブログ書いたり、BlenderでCarモデリングしたりと

やることはあまり変わりません(涙)

 

今回は思いつきなのですが、Skyboxを自分で作成する方法についてまとめようかなと思います

 

◆skyboxとは

skyboxは現実でいう「空」の役割をしています

デフォルトのskyboxはこれです↓

f:id:tubakihimeLoveHate:20190507213242p:plain

なんか寂しい風景ですよね...

 

次に、無料のアセットで手に入るskyboxを設定した時の風景がこちら↓

f:id:tubakihimeLoveHate:20190507213309p:plain


全然違います!ゲームの雰囲気をガラッと変えることができるので

もしデフォルトのままの人はいますぐ変えるべきです。これからはその手順の紹介になります

 

また、当記事ではこの上の画像で登場したWispyskyというアセットを例に、skyboxを作って行きますのでよかったらインポートして見てください!

 

◆skyboxの設定方法

skyboxの実態は「skybox/6 sided」 もしくは 「skybox/cubemap」シェーダーを使用したマテリアルです

マテリアルといえば球体のイメージアイコンで表示されますが、これらはテクスチャやスプライトのようなイメージアイコンなので混乱します 

f:id:tubakihimeLoveHate:20190512154507p:plain

これもマテリアルなんです。紛らわしいわ!

 

設定方法は3つあるので、まず1つ目

Lighting設定から変更する

f:id:tubakihimeLoveHate:20190512154346p:plain

 

2つ目

Sceneビューにドラッグする

 

3つ目

カメラにSkyboxコンポーネントをつける

f:id:tubakihimeLoveHate:20190512154404p:plain

 

1つ目と2つ目は同じものですが、3つ目は最優先に表示されるので注意

さて、skyboxの設定方法がわかったところでskybox用のマテリアルを作って行きたい!のですが、その前にCubeMapというものが出てくるので説明しておきます

 

Cubemapとは?

Cubemapは1枚の絵を6つの面に分割して擬似的に天球を作り出すというものです

この6つの面像の元となる画像はできるだけ精度の高い画像が良いと思います

 ↓Cubemapについてあまり詳細ではないですが、リファレンスがあります

Cubemap - Unity マニュアル

 

f:id:tubakihimeLoveHate:20190508223941p:plain

初見だと、「なんだこれ?」ってなりそうですが、下の図を見れば簡単です

この画像を

f:id:tubakihimeLoveHate:20190508223927p:plain

                                   

                                     ↓↓↓↓↓↓↓こうしろっ!↓↓↓↓↓

 

f:id:tubakihimeLoveHate:20190508224010p:plain

ってことです

これがCubemapと呼ばれるもので、skyboxを作成するとき必要になります

安心してくださいUnityは自動でこれをやってくれるのです(ありがとうUnity!!)

 

いよいよskyboxを作って行きます 

 

 

 

 ◆Cubemapシェーダーでskybox作成

Cubemapシェーダーの方は比較的簡単に作ることができます。後で比べて見ますがもう一つの6 Sidedシェーダーの方が精度が高い気がします。

手順:

 ①.元となる画像をインポートする

 元となる画像はできるだけ大きくて精度の高い画像が良いです。というのもskyboxは画像をかなり広げるので普通の写真だと粗っぽくなります。なので元がいいものにしましょう

「パラノマ,8k,HDR」とかで検索すると出てくると思います

ライセンス関係は各自で気をつけてください

 

今回はこの画像を使って作って行きます

f:id:tubakihimeLoveHate:20190512155113p:plain

 

②.画像の設定を変更する

インポートしたら画像の設定をします 

f:id:tubakihimeLoveHate:20190512155415p:plain

 

Texture shape:Cubeにする

Mappingという項目が出てきます

Mappingはどういう形で画像をCubemapにするかを決める項目です

f:id:tubakihimeLoveHate:20190512125638p:plain

Mapping項目を上から説明すると

・Auto:Unityが自動で判別

・6Frames Layout:Cubemapとは、で出てきた切り方

・Latitude-Longtitude Layout:パラノマ画像で、自然に見える

・Mirrored Ball:円形の画像用

 

今回はパラノマ画像なので「Latitude-Longtitude Layout」を選択

高画質に設定してApplyして完了です

※画像サイズが大きいと時間がかかってしまいますが、少し待ちましょう

 

③Create>Mterialでマテリアルを新規作成します。名前はなんでも良いです

④shaderからskybox/Cubemapを選択

⑤Cubemapの項目に先ほど作成したCubemapを選びます

f:id:tubakihimeLoveHate:20190512042913p:plain

 

完成したものをSkyboxに設定するとこのようになります 

f:id:tubakihimeLoveHate:20190512134719p:plain

 

完成してびっくり!自分でもこんな綺麗な画面作れると思わなかった笑

真ん中にある球体はReflectionProbeを適用したものです

また、ReflectionProbeについても記事書きたいのでそちらで紹介します

  

◆6sidedシェーダーでskybox作成

こちらはcubemapシェーダーと違い、限りなく天球に近いように見せることが可能です

これを作成するには6枚の画像が必要で、昔のCubemapみたくこの6枚の画像を

x,-x,y,-y,z,-zに指定して行きます

 

みなさん最初にたどり着くskyboxアセットはWispyskyだと思います(適当)

混乱を防ぐためにも、Wispyskyに内包されているレガシー(昔のバージョンで使っていた)なCubemapを説明します

 

WispyskyのCubemapのInspectorを見てみると、先ほど作成したCubemapと少し内容が違います

f:id:tubakihimeLoveHate:20190512140137p:plain

f:id:tubakihimeLoveHate:20190512140156p:plain

昔のCubemapの作り方もできますが今は推奨されていないみたいです

「こういうのもあるんだ〜」って見てもらうだけで結構です

 

ということで、 やっと6Sidedシェーダーでの作成方法に移っていきます

手順:

①画像を用意する

 最初ですが一番面倒なところです。Cubemapを6枚に切り取ってTextureで用意しなければいけません

しかし、Unityで自動生成してくれたCubemapはどこに格納されているのか、

また取り出せるのかすらわからないので画像はUnityの外側で用意しましょう

 

こんなサービスを見つけました↓

画像をCubemapに変換してくれたり、6枚に分割してくれます

ただ、私のpcでは6枚分割のモードは処理が重すぎたので、まずCubemapを作成して

地道に切り取りました

f:id:tubakihimeLoveHate:20190512150404p:plain

これで準備は完了です

 

②マテリアル作成

Create>Materialでマテリアルを作成し、Shaderを「skybox/6 Sided」に変更します

その後先ほどの6枚の画像をパズルみたいにはめていきます

f:id:tubakihimeLoveHate:20190512151259p:plain

というとこで完成です!

 

このskyboxを設定したのがこちら↓

f:id:tubakihimeLoveHate:20190512151910p:plain

画質はあまり変わりませんが、絵画がずれているのがわかりますか?

自分の手で切り取った場合、サイズが違ったらこのようなことが起こるのでなかなか難しいです・・・

あとは、画像が反転している場合もあるので直してインポートしましょう!

 

今回はここまで。ではまた

 

またはてなブログの発見として、中見出しと合わせて小見出しを設定して目次にすることで、ちゃんとずれて表示してくれるのを初めて知りました笑

最近は結構HTMLでも編集するので、ブログのことを書いた記事を出してみるのもいいかもしれない

以上余談でした

 

--------------------------------------------------------------------------------

※当ブログにおいてナンバリングはあまり関係ありません 

私とブログの成長記のようなものです

AnimationのTriggerがイライラしたのでメモ #3.1

 

f:id:tubakihimeLoveHate:20190418224059j:plain

 

どうも、ラブヘイトです!

Twitterでいいね、リツイート等沢山していただきありがとうございます

 

今回はタイトル通りです

前回の記事、

【Blender】→【Unity】Unityちゃんのアニメーション作成してみた #19 - うにty生活

この中で、Unityちゃんに1度だけ発動するアニメーションをつけようとしたところ

苦戦したのでメモします

 

◆Triggerとは

衝突判定の方ではありません。Animationの方のTriggerです

 

メカニム(アニメーション管理システム)ではステート遷移のためにパラメーターというフラグを使います

 

パラメーターの種類↓

f:id:tubakihimeLoveHate:20190416215154p:plain

今回はこのTriggerパラメーターについてのお話です

TriggerはBoolと似ていますが、一度だけ指定のモーションをしてくれます(Loopの場合は繰り返す)

そのため、使い方が正しければとても便利なのです

 

◆Triggerの説明・使い方

Triggerは一度だけ発動して自動的に元に戻ります

例えば、"opendoor"というモーションにTriggerでアニメーション遷移をしたい時のアニメーションコントローラーはこんな感じ↓

f:id:tubakihimeLoveHate:20190416215532p:plain

 

遷移するコードはこれです

animator.SetTrigger("Triggerの名前");

 

 

 

◆いらいらポイント

 

Triggerのいらいらポイント

1.高速に実行されているメソッドで使用できない

2.元のアニメーションへの戻し方がわからない

3.たまに自動で戻らない

 

1.高速に実行されているメソッドで使用できない

これはもちろんUpdateに直に書いてはいけないですが、if(Input.GetKey)などの中やfor内ではうまく動作しません

一度だけ動作する場所に記述しましょう

if(Input.GetKeyDown(KeyCode.J)){
animator.SetTrigger("Triggerの名前");
}

 後は、衝突した時などに使えそうな気がします

 

2.元のアニメーションへの戻し方がわからない

リファレンスに戻り方は記されていませんでした

というか内容の薄さに驚きました。もしかするとメカニムでの設定は別のページなのかもしれません

結果を先に記述すると、元のアニメーションに戻るにはトランジョンのConditionに何も設定しないことです

f:id:tubakihimeLoveHate:20190417193951p:plain

上の画像でcoldステートに返っている方のトランジョンです

f:id:tubakihimeLoveHate:20190417194127p:plain

このようにConditionには何も設定しなくて良いです

 

かなり探しました

 

3.たまに自動で戻らない

この不具合は原因がわからず、再現できないため経験談になります(全部経験談やけど)

普通Triggerは一度呼び出すと、1回だけ実行して元に戻りますよね?

しかしたまに戻らない時があるのです

原因はどうであれ明示的に元に戻すメソッドが用意されています

 

Unity - スクリプティング API: Animator.ResetTrigger

これが使いにくい!

というかそもそもTrigger戻らない時点で、アニメーションシステムが動作しなくなるので明らかに不具合です

 

まずsetTrigger使ってすぐResetTrrigerを使った場合

animator.SetTrigger("Door");
animator.ResetTrigger("Door");

これだと確かにTriggerはリセットされています

ただ高速にTriggerがOnOffするだけなのでTriggerで発動したいアニメーションが発動しない。これでは意味がありません

 

Triggerが戻らなくても別にエラーも何も出ないので例外処理でもキャッチできず、アニメーション止まってしまうし、ResetTriggerを有用に使う記事は見当たりませんでした

 いつ使うのやら・・・

◆応用編

Tiggerは一度使ったら元のアニメーションに戻ると説明しました

Triggerを使って連続で同じアニメーションをするには、Boolと併用します

 

まずはBoolパラメーターを作成します。OpenDoorというパラメーターを用意しました

f:id:tubakihimeLoveHate:20190418211438p:plain

 

次にステートとトランジョンの設定です

f:id:tubakihimeLoveHate:20190418211941p:plain

cold->test に「Opendoor/ false」

test->coldには「Opendoor/true」

testステートには自分自身にトランジョンを設定します。他のトランジョンと一緒でMake Transionして少し離し、またステートに戻すと設定可能です。

Conditionには「Door」ステートを設定します

 

実際の動きと合わせてメカニムの動きも見て行きましょう

f:id:tubakihimeLoveHate:20190418221445g:plain


 Opendoorを falseに戻せばもちろん前のアニメーションに戻ることが可能です!

どこかで使うことがあるかもしれませんね

 

というとこで今回はブログでの怒り発散コーナーでした笑

 

 

--------------------------------------------------------------------------------

※当ブログにおいてナンバリングはあまり関係ありません 

私とブログの成長記のようなものです

 

【Unityちゃんに友達できた!】 NPC自動歩行&会話できるようにしてみた #20

 

どうもラブヘイトです

やっと20回目の記事になります!(番外加えれば26回目!)

 

今日はうにty生活ブログにお友達がやってきました!

Amane Kisoraちゃんです!

f:id:tubakihimeLoveHate:20190220115913p:plain

f:id:tubakihimeLoveHate:20190220115602p:plain

目が輝いてる!笑

ザ・アイドルって感じですね

 

 

◆Amane Kisoraちゃんをインポート

assetstore.unity.com

 

アセットに抵抗がある人はこちら↓

 

 

 

◆適当にその辺を歩くNPCにする

突っ立っているだけではかわいそうなので、今回はNPCになって適当にその辺を歩いてもらいます

f:id:tubakihimeLoveHate:20190221120756g:plain

 

ずっと歩かれても落ちちゃったりして困るので、5秒歩く→5秒休むという感じにしました!

コードいるかな?一応載せますね

public class KisoraController : MonoBehaviour {

    Animator animator;
    Rigidbody rigid;
 
 
    float h;
    float v;

    //速さ
    public float speed = 1.5f;
   //走行時
  private float pulusSpeed=1;
  //方向転換スピード
  public float rotateSpeed = 200f;

    //最初のループに入るため
    float timer= -0.1f;
    bool timerIn = true;


    // Use this for initialization
    void Start () {
        animator = GetComponent<Animator>();
        rigid = GetComponent<Rigidbody>();
    }
    
    // Update is called once per frame
    void FixedUpdate () {

        if(timer < 0){
            h = Random.Range(-0.5f,0.5f);
            v = 1;
        }else if(timer > 5){
            h=0;
            v=0;
        }

        if(timerIn){
            animator.SetBool("walk",true);
            Vector3 velocity = new Vector3(0,0,v);
            

            // キャラクターのローカル空間での方向に変換
            velocity = transform.TransformDirection(velocity);

            float speedCache = speed *pulusSpeed* Time.fixedDeltaTime;

            // キャラクターの移動
            transform.localPosition += velocity * speedCache;
            // キャラクターの回転
            transform.Rotate(0, h * rotateSpeed * Time.fixedDeltaTime,0);
 
            timer += Time.fixedDeltaTime;
          if(timer>5)timerIn = false;
 
        }else{
            animator.SetBool("walk",false);
            timer -= Time.fixedDeltaTime;
            if(timer<0)timerIn = true;
        }
    }
}

短時間でやったので結構適当ですが一応動きます

歩かせかたはUnityちゃんと一緒です↓

 

 

 

 

◆会話できるようにしてみた

お友達とはやっぱり会話したいですよね

ということでKisoraちゃんと会話できるようにしました!

f:id:tubakihimeLoveHate:20190221122236g:plain

キャー!Kisoraちゃんがこっち向いて話してくれてるー!(アイドル風w)

 

インタラクトが「開ける」なのは気にしないでください笑

過去の記事から再利用しています↓ 


 急に振り向いたり、会話中なのに動き出したりとまだ調整は必要ですが

簡単なので裏でやっときます笑

 

 

◆おまけ

Kisoraちゃんアセットについてた?(もしかしたら最初からあったかも)

Mobile/Unlit(Supports Lightmap)っていうシェーダーでめっちゃUnityちゃん綺麗になりました!!

実は正直こっちの方が驚きだった回

f:id:tubakihimeLoveHate:20190220120237p:plain

 

ではまた

 

 

 

--------------------------------------------------------------------------------

※当ブログにおいてナンバリングはあまり関係ありません 

私とブログの成長記のようなものです

ブレンドツリー使ってみた #17

 

どうもラブヘイトです

12月に300PVいきました!「ありがとうございます」なんですが、1月の卒論の方に力入れていてサボってました...

また更新していきます

 

 

今回はメカニムにブレンドツリーという機能があったので使ってみました

 

 

◆Mecanimとは

f:id:tubakihimeLoveHate:20190117171245p:plain

メカニムはUnityでアニメーションを管理するシステムです

docs.unity3d.com

 

今までもアニメーションの記事を書いてきたけどこの説明するの忘れてました

作成方法は

プロジェクトビュー>Create>AnimatorController です

 

この後も色々用語が出てくるのでわからない方はこちらの記事から

 

tubakihimelovehate.hatenablog.com

 

 

◆BlendTree(ブレンドツリー)とは

f:id:tubakihimeLoveHate:20190117171744p:plain

このブレンドツリーはステートの一種で、複数のアニメーションクリップをブレンド(混ぜる)ことができます

 

見た目は他のステートと変わらないので少しわかりにくいですが、普通のステートと違ってダブルクリックをするとBlendTreeの画面に遷移します

f:id:tubakihimeLoveHate:20190117172046p:plain

 

作成方法

AnimatorControllerを開く >何もないところで右クリック>Create State

>From New Blend Tree

 

ブレンドツリーを使うには最低でも2つのアニメーションクリップが必要です

パラメーターの数は扱うブレンドツリーの方法によって異なるみたい

 

◆現在のUnityちゃんAnimetorController

今のUnityちゃんのアニメーションコントローラーはこんな感じです

f:id:tubakihimeLoveHate:20190117171230p:plain

 

f:id:tubakihimeLoveHate:20190117173607g:plain

今のままではwalkからrunへの切り替わりがいきなりで不自然?(そんなに変ではないけど...)なので

BlendTreeを使って徐々にrunモーションに切り替わるようにしていきます

 

また、ステートを減らすことができるためトランジョン(矢印)も減らすことが可能

 

トランジョンをさらに減らしたいときはAnyStateを使うのがいいですが、それはまた今度で(シンプルイズベスト!)

 

◆BlendTree使い方

①まずはBlendTreeステートの名前を変更していきます、今回はwalkからrunに遷移していくので「walk_run」という名前にしました

 

f:id:tubakihimeLoveHate:20190117173841p:plain

 

②BlendステートをダブルクリックしてInspectorを表示させる

f:id:tubakihimeLoveHate:20190117174512p:plain

 

※ステートのMotionに設定してあるBlendTreeをダブルクリックでもInspectorを表示させることは可能ですが、その場合変化するのはInspectorの表示だけでAnimatorビューは変化しません

 

 

 

③パラメーターを作成する

アニメーションをブレンドする割合となるFloat型のパラメーターを作成します

名前は「walk_runBlend」にしました

 

④Blend Typeを選択する

今回使うアニメーションクリップは2つなので「1D」を選択

そしてパラメーターに③で作成したものを選択

 

⑤アニメーションクリップを設定

Motionの+を押してアニメーションクリップを追加していきます

追加した状態のAnimatorビューとInspectorビューはこんな感じ↓

f:id:tubakihimeLoveHate:20190117175344p:plain

f:id:tubakihimeLoveHate:20190117175403p:plain

 

ここでパラメーターの値によってどういった変化をしていくのか見ることができます

f:id:tubakihimeLoveHate:20190117180401g:plain

f:id:tubakihimeLoveHate:20190117180439g:plain

画像が悪くて申し訳ない・・・

下のgifの方がわかりやすいと思います

 

今までのステートを削除し、ブレントツリーにトランジョンを接続する

f:id:tubakihimeLoveHate:20190121003054p:plain

 

どうでしょう?最初に比べてスッキリしたかと思います

やっていて初めて気がついたのですがトランジョンって単体で削除できないの?

できるよって方教えてください(ぺこり)

 

◆スクリプトからパラメーターを制御

先ほど設定したアニメーションをスクリプトから制御します

アニメーションを変更させたい場合は、BlendTreeに設定しているパラメーターを変更します

 

コードはこんな感じ

//上矢印キーが押されている間walkingをtrueにする
if(v > 0){
 animator.SetBool("walking",true);
 animator.SetFloat("walk_runBlend",(speedCache-minSpeed)/(maxSpeed-minSpeed));

 

 walkingはwalk_runステートに遷移するためのパラメーターです

 

ここでwalk_runBlendの範囲は0〜1でなければなりません

そのため、キャラクターのスピードを0〜1の値に正規化しました

 

式>> S = (T-MinT)/(MaxT-MinT)

この式でSの値は0〜1に正規化されます

 

//isrunは走っているかどうか
if(isrun){
  speedCache += 0.025f;//アニメーション遷移調節
}else{
  speedCache -= 0.025f;
}

↑こんな感じで値は変更していく

 

さて、Unityちゃんをみてみましょう

f:id:tubakihimeLoveHate:20190121004520g:plain

より自然に歩きと走りが切り替わるようになりました!

 

◆ブレンドツリーの種類

今回紹介したBlendTreeは1Dでしたが、他にも様々な方法でアニメーションをブレンドできます

ここでは主に使用するものをまとめてみました

 

・2D

f:id:tubakihimeLoveHate:20190121123748p:plain

 

1Dではキーとなるパラメーターは一つだけでしたが、2Dでは二つのパラメーターを使い座標を操作してアニメーションをブレンドしていきます

2Dも2つ以上のアニメーションをブレンドします

 

図の灰色◆はそれぞれモーションが入っています

そして赤点がブレンドの割合なので、中心にあるときは4つ全てを混ぜたアニメーションとなります

XとYの範囲は−1〜1で、赤点が一つのひし形と重なったときは重なったアニメーションだけを実行します

 

・Direct

f:id:tubakihimeLoveHate:20190121124600p:plain

 

Directは全てスクリプトで制御する方法です

範囲となるパラメーターも自身で設定する必要があります

その分範囲を自分で決定できるので、今回みたいにわざわざ0〜1の範囲に正規化しなくともスピードをそのまま利用可能になったり

 

 

 

新年1発目はここまで!

ではまた

 

【Blender】Blender初心者、初めてのキャラモデリング #16

#2020/8/16に更新

まじでこの時Blender初心者すぎて下手すぎる.....

 

どうもラブヘイトです。最近はずっとBlenderしてました

 

今回はBlenderで初めてキャラモデリングをして、Unityへインポートした感想や、つまずいたところを紹介していきます

 

 

 

 ◆完成品(途中だけど)

先に完成した作品をご覧ください

f:id:tubakihimeLoveHate:20181213112316p:plain

 

ToLoveるの金色の闇ちゃんです

中学生くらいの時に好きだったのでこのキャラで練習しよってなりました

 

作成期間はほぼ1ヶ月です

と言っても時間にしたら50時間もかかってないです

 

◆準備から顔の作成

最初の準備や顔の作成はYoutube動画で学びました

「わにこ沼地辺境伯」さんの動画再生リストです

www.youtube.com

 

この動画はキャラを一人完成させよう!というコンセプトですが、

残念ながら顔の終盤で動画投稿がストップしています

 

ですがかなり丁寧で、始めるきっかけになることは間違いなし!

この動画のおかげで重要なショートカットキーが簡単に覚えられました

 

私は3面図が出てきたあたりで、「えっ・・そんなのかけねーし」って思いましたが

さすがわにこさん、用意してありました

 

キャラデザインだけは自分でしなければいけませんが、結構適当にしててもだいたいあってれば大丈夫でした

実際に使った三面図をお見せします

f:id:tubakihimeLoveHate:20181213110045p:plain



側面のやる気のなさw

実はこれアイビスペイントというスマホアプリケーションで手書きで書きました

それでも最初の画像のようなものができるってすごいですよね

だから絵心はそこまで必要ではないなと感じました(あるに越したことはない)

 

◆体・髪など

動画は顔で終わってしまっているためほかの動画を引き続き参考にして

続きを作成しました

www.youtube.com

 

この動画は早送りでキャラデザインをしていきます

正直早くて何をしているかは全くわかりませんが、私が見ているのは工程です

どこの部分を作成して、次はどこで・・というのがわかる程度でよかったのです

 

そのくらいにわにこさんの動画で基礎が身についていました

 

◆つまずいたところ

わにこさんの動画や早送り動画だけではもちろんわからない部分が出てきます

 

・手

「手」ですね。自分の手を見ながらバランスを取るのに手間取りました

f:id:tubakihimeLoveHate:20181213110404p:plain



私は適当に作ってしまいましたが、あとで調べるとこちらの記事に良い方法がありました

http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/modelingBody.html

 

 

 

・どうやってテクスチャを目に貼るのかという疑問

それはこの記事で解決しました

original-game.com

 

 

・まつげにマテリアルを適用する場面(本来は苦労するところではありませんが)

「黒いマテリアルをまつげに適用させたのになぜ反映されないんだ!」

とずっと考えていて

色々試行錯誤した結果自分では解決できなかったのでテラテイルで質問しました笑

 

結局解決方法は簡単なことでした、ソリッドモードだからマテリアルが適用されてなかったのです

 

 

・髪の毛

正直一番時間がかかったと思います

髪の毛の作成方法はいろいろあるのですが、私はUV球からEで押し出して厚みづけして

作成しました

f:id:tubakihimeLoveHate:20181213110747p:plain

 

 

◆BlenderからUnityへインポート

ここもつまずいたところですね

ボーンとかUV展開やらしてないのですがとりあえず現状をUnityに入れてみましが

Blenderのエクスポート設定やらテクスチャ関連が初見ではわからないですね

 

Unityにインポートする時テクスチャが反映されないのは知ってたけど

解決方法がなかなか見つからず、やっとこちらのブログの方法で解決できました!

 

ありがとうございます。幸せになりました

wbhappy.hatenablog.jp

 

何度かUnityにインポートした結果がこちら

f:id:tubakihimeLoveHate:20181213110928p:plain

Blenderでレンダリングしたのと全然違うし、全体的に光沢があってきm...

やば、この画像笑 ほんまに消したい(2020/8/16)

 ◆感想

初めてにしては、って感じですが

まだまだ課題がありますね、、、

でもとりあえず今回はBlenderでつまづいたところなので

 

課題の解決はまた次回の記事で紹介したいと思います

 

 

服作るのが一番楽しかった!

 

それでは

 

 

 

Fortniteのインタラクト真似してみた #16

 

どうもラブヘイトです

今回から#ごめんねEpicGames シリーズ始めていきます!

決して煽っているわけではなく...(汗)

Fortnite大好き人間だからこそUnityでも再現したいなと思い至っただけです

 

私のパソコンではUE4は重くて重くて...

 

 

はじめに

インタラクトの英語としての意味は「相互に作用する」らしいです

こっちがアクションを起こしたら、オブジェクトも動き出すって感じでしょうか笑

◆作りたいもの

というわけで今回作っていくのは人気バトロワゲーム、「Fortnite」の

一部分を真似していきます

 

見ていただいた方が早いのでこちら↓

f:id:tubakihimeLoveHate:20181208091805g:plain



今回作っていくのは

宝箱や扉に近づいた時に出てくる「開ける」と表示する機能です

 

◆UIを作成する

真似しようという企画なので、とことん似せていきます

3Dの中にUIがあるみたいに見えるので、今回はオブジェクトとして扱えるWorld SapceのCanvas利用していきます

(Canvasいちいちでかくなるのめんどくs...)

canvasについては過去の記事を参考にしてください

 

tubakihimelovehate.hatenablog.com

 

 

f:id:tubakihimeLoveHate:20181209212846p:plain



またまた登場タンスの横幅半分くらいのサイズにしたら、タンスくん(なんでもいい)の子にします

 

◆コード

新しいスクリプトを作成します

もともとタンスにはBox ColliderがついているのでOnCollitionStayメソッドを使います

こんな感じ↓

//UIをセット
    public GameObject open;
 
void OnCollisionStay(Collision other)
    {
        open.SetActive(true);
    }

    void OnCollisionExit(Collision other)
    {
        open.SetActive(false);
    }

 

さらにUIはキャラクターに関係なく、いつでもカメラを向いてほしいので

2行追加します

 
//カメラをセット
    public GameObject camera;

 

void OnCollisionStay(Collision other)
    {
        open.SetActive(true);
        open.transform.LookAt(camera.transform);
    }

 

f:id:tubakihimeLoveHate:20181209214410g:plain



これでどのカメラ位置からUnitychanが当たっても

必ずカメラを向くUIが完成しました

 

◆問題点

これだとタンスとUnityちゃんの距離が0距離にならないと出てこない、、

普通タンスは離れて開けますよね

 

タンスとしての当たり判定も欲しいし、離れた場所からもあたり判定欲しいと思ったので2つBoxColliderをつけてみました!(丸いコライダーでもいいかも)

そのうち一つは範囲を広げてisTriggerにチェックをつけてコードを付け足します

f:id:tubakihimeLoveHate:20181209214713p:plain



最終的にできたコードはこちら

 

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

public class tumbaTouch : MonoBehaviour {

    //UIをセット
    public GameObject open;

    //カメラをセット
    public GameObject camera;
//インタラクトUIの長押しに反応するゲージ
//Findは使わない主義なので定義します
    public Image gage;
//タンスが開いているか判定
    bool getOpen = false;
 
    Vector3 offset = new Vector3(0,0,14f);

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void FixedUpdate () {
        if(open.activeSelf && Input.GetKey(KeyCode.P)){
            gage.fillAmount += Time.fixedDeltaTime;
        }else{
            gage.fillAmount = 0;
        }

        if(gage.fillAmount == 1){
//開いているかどうかの判定
            if(getOpen)
                transform.localPosition -= offset;//閉める処理
            else
                transform.localPosition +=offset;//開ける処理

            getOpen = !getOpen;
            gage.fillAmount = 0;
        }
    }
 
/*
  void OnCollisionStay(Collision other)
    {
        open.SetActive(true);
        open.transform.LookAt(camera.transform);
    }


 
    void OnCollisionExit(Collision other)
    {
        open.SetActive(false);
    }
*/
 
 
    void OnTriggerStay(Collider other)
    {
        open.SetActive(true);
        open.transform.LookAt(camera.transform);
    }

 
    void OnTriggerExit(Collider other)
    {
        open.SetActive(false);
    }
 
}

 

2つもColliderあっていけるのかなあと疑問でしたが、コードもしっかりどちらとも反応してくれるみたいです(2つつけていいものかどうかは知らん)

 

てな感じで離れた少し離れた場所からインタラクトできるようになってよかった!

f:id:tubakihimeLoveHate:20181209215437g:plain

 

もしオブジェクトがたくさん配置されている場合はtagとかで制御すればいいと思います

 

Fortnite好きなのでまたこのシリーズしますw

ではまた

 

キャラクターの動かし方を見直してみた #15

#2020/8/16に更新

 

どうもラブヘイトです

2018年もとうとうあと何日か、というところです

正直今やっと好きなことができています

この時間を大切にしていきたい

 

今回は過去の記事で変なところを見直してみました

 

◆現在の状況

 

tubakihimelovehate.hatenablog.com

 

 

tubakihimelovehate.hatenablog.com

 

これらの記事で、最終的には3つのキャラクター移動方法から、

RigidBody+Colider+Transform移動 ということに決定しました

 

実際はこのように動かしている状況です

public class UnityChanControl : MonoBehaviour {

//速さ
    public float speed = 3f;
 
//方向転換スピード
public float rotateSpeed = 200f;
 

void Start()
    {
    }

void FixedUpdate()
{

float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");

        
Vector3 velocity = new Vector3(0, 0, v);

        // キャラクターのローカル空間での方向に変換
        velocity = transform.TransformDirection(velocity);

        // キャラクターの移動
        transform.localPosition += velocity * speed *pulusSpeed* Time.fixedDeltaTime;

        // キャラクターの回転
        transform.Rotate(0, h * rotateSpeed * Time.fixedDeltaTime, 0);

 このスクリプトとRigidBody・ColliderをUnityちゃんにアタッチしています

 

これでもかなり自然なのですが(変なところと言ったらムーンウォークしてしまうくらいです)

 

ある日TwitterをみているとRigidBodyに関するリファレンスがあり、みていると

RigidBody中にTransform移動させるものではない」と書かれてあり

やべ・・・ってなったのが今回の経緯です

 

なので、移動方法を再検討していきます!

 

◆以前の条件

前回の記事で設定した、実現していきたいUnityちゃんの移動方法の条件はこちら

1,人として自然

2,壁を通り抜けない

3,階段を登れる

 

この3つでしたが、もう2つ条件を追加します

4,自然な重力のかかり方

 5 ,TransformとRigidBodyを一緒に使わない   ←今回の課題

 

 

新、移動方法はRigidBodyに力を加えて実現させていきます

 

 

◆RigidBodyに力を加える

まずは共通部分から

 

public class UnityChanControl : MonoBehaviour {

//速さ
    public float speed = 3f;
 
 
//方向転換スピード
public float rotateSpeed = 200f;

public Rigidbody rigid;



void Start()
    {
rigid = GetComponent<Rigidbody>();
    }

void FixedUpdate()
{

    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");

        
    Vector3 velocity = new Vector3(0, 0, v);
 

      // キャラクターのローカル空間での方向に変換
      velocity = transform.TransformDirection(velocity);

  //この間に移動処理
 
    // キャラクターの回転
        transform.Rotate(0, h * rotateSpeed * Time.fixedDeltaTime, 0);
 
 
    }
}

上のコードは共通部分で、入力された値をもとに移動できるコードを書いていきます

 

色々試してみました

・今までの移動方法(Transform):RigidBodyと共存できないため非推奨

transform.localPosition += velocity * speed *pulusSpeed* Time.fixedDeltaTime;

 

・RigidBody.AddForce:失敗 勝手に動く

rigid.AddForce(transform.position+velocity*speed*Time.deltaTime);

 

・RigidBody.AddForceAtPosition:失敗 歩けるが滑っていく

rigid.AddForceAtPosition(velocity*10,transform.position);

そもそもAddForceは速度にどんどん足されていくので、人間の動きではない

 

・RigidBody.velocity:失敗 勝手に動く(制御しても明後日の方向に飛んでいく)

rigid.velocity = transform.position*0.1f;

 

・RigidBody.position:成功 Transformと同じ動作が確認できた

階段も登れて、重力も自然

rigid.position = transform.position+velocity*speed*Time.deltaTime;

 

・RigidBody.MovePosition( ):成功 Transformと同じ動作確認 階段・重力ok

rigid.MovePosition(transform.position+velocity*speed*Time.deltaTime);

 

最後ふたつは同じ意味ですがMovePositionは、RigidBodyのisKinematicの値によって

動き方が変わります

falseの時は空間移動trueの時は瞬間移動になります

 

isKinematicは物理演算の有効(false),無効(true)を切り替えます

いつもと逆なので気をつけてください

なのでここがtrueになっている時は別にTransformで移動させても良いのです

 

例えばキャラクターがワープして、遠くの違う場所に行くときなどは

isKinematicを一時的にtrueにしてTransformで一気に動かすというのが可能です

 

 

 

◆比較

以前の移動方法と比較してみます

f:id:tubakihimeLoveHate:20181205214252g:plain

Before(Transform)

f:id:tubakihimeLoveHate:20181205214349g:plain

After(RigidBody.position)


同じ動作になりました!

 

最後に気になるのは方向転換はTransformでいいのか?ということですね

今の所変な動きはしていないのでそのままにしておきます、、、w

 

 本当はisKinematicの活用や、CharacterControllerとかでも動かそうと検証していたのですが

案外簡単に見つかってしまったので簡潔にこれだけ書くことにしました

 

◆最後に

今回の記事では文字サイズを大きくしたり、枠をつけて見たりと

ブログ自体も見やすくしました!

 

これからも少しづつ試行錯誤しながら個性と読みやすさを調和させていきます!

ではまた