トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Unityで絵文字っぽいのをパーティクルで出す

 VRChatの絵文字機能みたいな感じで、絵文字をパーティクルで空間に飛ばしたい

bibinbaleo.hatenablog.com

絵文字画像用意

別にあのUnicodeのEmojiじゃなくていいんだけど、どうやって用意しようかな~🥺

ちなみにVirtualCastでUniCodeのEmojiをUnityで扱った記事があった。大変そう><

https://virtualcast.jp/blog/2019/10/emoji/

OpenEmoji

単色のアイコンならいろいろサイトはあるけど、カラフルなアイコンがあるサイトいまいち知らない・・・探せばいろいろあるだろうけど。

OpenEmojiというサイトがあった

openmoji.org

いろいろなEmojiがあって、

f:id:bibinbaleo:20201228133906p:plain

個別でsvgやpngでダウンロードできる。全部まとめてもできる。

f:id:bibinbaleo:20201228133911p:plain

カラフルだし良きー

全部誰かが作ってくれている。ぴえん🥺(PladingFace)はあんまりぴえん感がなかった

f:id:bibinbaleo:20201228151414p:plain

https://openmoji.org/library/#search=Pleading&emoji=1F97A

ライセンスはCC-BY-4。著作権表記が必要

All emojis designed by OpenMoji – the open-source emoji and icon project. License: CC BY-SA 4.0

 

 

とてもありがたいけど、表記必要なの忘れるとめんどくさいから、MaterialDesignでアイコンダウンロードして自分で色付けたほうが良いかな

Icons - Material Design

あっ、でも拍手とかかなさそう

パーティクル

久々にParticle使う

Create>Effect>ParticleSystem

f:id:bibinbaleo:20201228140601p:plain

Perticle用のマテリアルを作る。

ShaderはParticles>StandardUnlit。もしくはMobile>Particle>?でもいい

RenderingModeをCutoutなどにする。Albedoに画像入れる

f:id:bibinbaleo:20201228140610p:plain

これをPerticleにぽいってする。RendereのMaterialに入ってたらいい

f:id:bibinbaleo:20201228140808p:plain

これでできたー

f:id:bibinbaleo:20201228140613p:plain

あとはLooping外したり、数値をいろいろ減らした。

f:id:bibinbaleo:20201228140805p:plain

ボタン押したら出てくる

ボタン押したら作ったParticleが出てくるようにする。(下のがボタン)

f:id:bibinbaleo:20201228150415p:plain

方法はいろいろありそう

f:id:bibinbaleo:20201228144006p:plain

パーティクルをプレハブ化して、Instantiateする方法

パーティクルをプレハブ化してGameObjectとしてInstantiateする

    public GameObject particleObject;

    public void ShowParticle()
    {
        Instantiate(particleObjectthis.transform.positionQuaternion.identity);
    }

your-3d.com

パーティクルのEmit()を使う

ParticleSyetemでパーティクルのパラメーターをいじれる

    public ParticleSystem particleObject;

    public void ShowParticle()
    {
        particleObject.Emit(10);
    }

Emit(数字)でパーティクルが出る

この場合、パーティクルはPlayOnAwakeをオフにしてシーンにおいておく

f:id:bibinbaleo:20201228143832p:plain

で、スクリプトのInspectorにセット

f:id:bibinbaleo:20201228143920p:plain

こちらのほうがInstantiateするよりコストが安いって

オブジェクトの生成・破棄は結構負荷が高いです。また、ParticleSystemは結構多くのパラメータを持つオブジェクトであり、インスタンス化・破棄で結構多くのCPU・メモリを喰います。

その点、ParticleStstem.Emitでパーティクルを生成しまくる場合、ParticleSystemを量産するよりかなり安くパーティクル表現出来るっぽいです。

tsubakit1.hateblo.jp

 パーティクルシステムが1個だけの場合はそんなに変わらないかな?

gomafrontier.com

マテリアルだけ変える

今回ParticleSystemを複数用意したけど、一つのParticleSystemでマテリアルだけ変えてもよさそう。

スクリプトからRendereを変えるにはParticleRendererをGetComponentする

cdecrement.blog.fc2.com

こんな感じでできた。

    private ParticleSystemRenderer _Renderer;
    public ParticleSystem _ParticleSystem;
    private void Start()
    {
        _Renderer = _ParticleSystem.GetComponent<ParticleSystemRenderer>();
    }
    
    public void ShowParticle(Material material)
    {
        _Renderer.material=material;
        _ParticleSystem.Emit(10);
    }

f:id:bibinbaleo:20201229094739p:plain

Textureだけ変える

もっといえば、マテリアルも共通にしてTextureだけ変えてもよさそう

mslgt.hatenablog.com

    public ParticleSystem _ParticleSystem;
    public Material _TargetMaterial;

        public void ShowParticle(Texture2D texture)
    {
        _TargetMaterial.SetTexture("_MainTex"texture);
        _ParticleSystem.Emit(10);
    }

テクスチャ名はMaterial>歯車>EditのPropertiesで見れる

f:id:bibinbaleo:20201229100554p:plain

f:id:bibinbaleo:20201229100552p:plain

 

どれがいいんだろう

最後に

とりあえずできた

f:id:bibinbaleo:20201228150623g:plain

Release パーティクルで絵文字が飛ぶやつ · bibinba/Haihu · GitHub

 

本格的なパーティクルは昔本でやって以来。スクリプトで操作するのは初めてだと思う。いつも出しっぱなし
bibinbaleo.hatenablog.com