かぴばらさんの覚書ブログ (nonkapibara 自分メモ)

かぴばらさんの覚書ブログ (nonkapibara 自分メモ)

Unity勉強中です。 AR、VR、エンターテイメント全般、ワクワクする事が大好き♪♪ O(≧∇≦)O イエイ!!

【Unity】キャラクターを弾ませる(ARKit)

実際に動かした動画はこちら↓↓

https://twitter.com/nonnonkapibara/status/1094640606683385856

 

 

Unity ARKit Pluginを使用する

下記ページを参照にして、ダウンロードする。

qiita.com

 

■環境
 ⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Mac Book

 

1.UnityARKitSceneを展開する

f:id:nonkapibara:20190211022349p:plain

2.以下を非表示にする

①「RandomCube」非表示

②「GeneratePlanes」非表示

③「PointCloudExample」非表示

④「PointCloudParticleExample」非表示

⑤「AR3DOFCameraManager」非表示

f:id:nonkapibara:20190211022201p:plain

3.「HitCubeParent」の配下のHintCubeを削除して、新しくGameObjectを作る。

(PiyoKumaObjectという名前にした)

新しく作ったGameObjectに

Unity AR Hit Test Example」を追加する

Unity AR Hit Test Example」のHit Transformに「HitCubeParent」をセットする。

f:id:nonkapibara:20190211022927p:plain

4.床(Plane)を透明にするには(shadowPlaneMaterial)をセットする

f:id:nonkapibara:20190211023120p:plain

 

5.床(Plane)にPhysicをセットする

f:id:nonkapibara:20190211023219p:plain

f:id:nonkapibara:20190211023245p:plain

6.キャラクターに、Physicをセットする

f:id:nonkapibara:20190211023324p:plain

7.メタリックのマテリアルボールにも、Physicをセットする

f:id:nonkapibara:20190211023402p:plain

f:id:nonkapibara:20190211023447p:plain

8.Gameオブジェクトに、スクリプトをセットする

f:id:nonkapibara:20190211023518p:plain

9.ボタンのCanvas「UI Scale Mode」を「Scale Width Screen Size」にする

f:id:nonkapibara:20190211023813p:plain

10.ボタンにClickイベントを追加する

f:id:nonkapibara:20190211023849p:plain

 

※メタリックのマテリアルボールの設定

f:id:nonkapibara:20190211024009p:plain

 

 

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

public class piyoKuma : MonoBehaviour {
    public GameObject yello;
    public GameObject pink;
    public GameObject green;
    public GameObject blue;
    public GameObject redball;
    public GameObject blueball;
    public GameObject orangeball;

    private float posistionYello;
    private float posistionPink;
    private float posistionGreen;
    private float posistionBlue;
    private float posistionRedball;
    private float posistionBlueball;
    private float posistionOrangeball;

    void Start () {
        // Y軸を退避
        posistionYello = GetCurrentPosition(yello);
        posistionPink = GetCurrentPosition(pink);
        posistionGreen = GetCurrentPosition(green);
        posistionBlue = GetCurrentPosition(blue);
        posistionRedball = GetCurrentPosition(redball);
        posistionBlueball = GetCurrentPosition(blueball);
        posistionOrangeball = GetCurrentPosition(orangeball);

        // 重力を無効にする
        SetGravity(yello, false);
        SetGravity(pink, false);
        SetGravity(green, false);
        SetGravity(blue, false);
        SetGravity(redball, false);
        SetGravity(blueball, false);
        SetGravity(orangeball, false);
    }

    /*
     * 重力の有効、無効設定
     */
    private void SetGravity(GameObject targetObject, bool enabledFlag) {
        targetObject.GetComponent<Rigidbody>().useGravity = enabledFlag;
    }

    /*
    * Y軸の位置取得
    */
    private float GetCurrentPosition(GameObject targetObject) {
        return targetObject.transform.position.y;
    }

    /*
     * StartボタンClick処理
     */
    public void onTapPiyoKumaButton(){
        if (IsStop())
        {
            // ボールに重力をセットする
            SetGravity(yello, true);
            SetGravity(pink, true);
            SetGravity(green, true);
            SetGravity(blue, true);
            SetGravity(redball, true);
            SetGravity(blueball, true);
            SetGravity(orangeball, true);

            yello.transform.position = GetGravityMove(yello, posistionYello);
            pink.transform.position = GetGravityMove(pink, posistionPink);
            green.transform.position = GetGravityMove(green, posistionGreen);
            blue.transform.position = GetGravityMove(blue, posistionBlue);
            redball.transform.position = GetGravityMove(redball, posistionRedball);
            blueball.transform.position = GetGravityMove(blueball, posistionBlueball);
            orangeball.transform.position = GetGravityMove(orangeball, posistionOrangeball);
        }
    }

    /*
     * ボール落下移動
    */
    private Vector3 GetGravityMove(GameObject targetObject, float currentPosition)
    {
        return  new Vector3(targetObject.transform.position.x, currentPosition, targetObject.transform.position.z);
    }


    /*
    * ボール停止確認
    * 停止している場合はtrueを返す。動いている場合はfalseを返す。
    */
    private bool IsStop()
    {
        return yello.GetComponent<Rigidbody>().IsSleeping() &&
                     pink.GetComponent<Rigidbody>().IsSleeping() &&
                     green.GetComponent<Rigidbody>().IsSleeping() &&
                     blue.GetComponent<Rigidbody>().IsSleeping() &&
                     blueball.GetComponent<Rigidbody>().IsSleeping() &&
                     orangeball.GetComponent<Rigidbody>().IsSleeping() &&
                    redball.GetComponent<Rigidbody>().IsSleeping();
    }
}

 

 

【Unity】キャラクターを弾ませる

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Unity 2018.2.15f1

 

キャラクターを弾ませる

実際に動かした動画はこちら↓↓

https://twitter.com/nonnonkapibara/status/1094639157761036288

 

1.キャラクターをPrefab化し、Rigidbodyを追加する。

Use GravityをチェックONし、Colliderをつける

f:id:nonkapibara:20190211020317p:plain

2.キャラクターを弾ませる為に、Physic Materialを設定する

f:id:nonkapibara:20190211020507p:plain

 

f:id:nonkapibara:20190211020636p:plain

f:id:nonkapibara:20190211020715p:plain

3.Physic Materialをキャラクターに設定する

f:id:nonkapibara:20190211020832p:plain

4.床(Plane)にも、Physic Materialを設定する

f:id:nonkapibara:20190211020932p:plain

 

完成!!

 

 

【Blender】UV展開とベイクをしてからUnityへ取り込む

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Blender v2.79.6

⭐️Unity 2018.2.15f1

⭐️Mac Book

 

####準備#####

Inkscapeでキャラクターを描画して、png保存する

f:id:nonkapibara:20190209120238p:plain

 

Blenderpng画像の下絵を取り込む

【Blender】Blenderでpng画像の下絵を取り込む - Qiita

それから、Blenderで、3Dモデリングにする

f:id:nonkapibara:20190209120521p:plain

f:id:nonkapibara:20190209120655p:plain



####ここから、本題の作業へ入る!!!#####

 

1.対象のキャラクターを全て結合する

f:id:nonkapibara:20190209105132p:plain

f:id:nonkapibara:20190209105304p:plain

 

2.キャラクターを全選択する。

「レンダー」を選ぶ。

「Texture Atlas」を追加する

 

※Texture Atlasのアドオンが入っていない場合は、こちらを参照する。

【Blender】UV Texture Atlasを追加する - かぴばらさんの覚書ブログ (nonkapibara 自分メモ)

f:id:nonkapibara:20190209105506p:plain

3.Texture Atlasが追加できたら、「Auto Unwrap」(展開)ボタンを押す

f:id:nonkapibara:20190209105631p:plain

4.展開が終わったら「UV画像エディター」を開く

f:id:nonkapibara:20190209110102p:plain


5.先ほど展開したテクスチャを選択する

f:id:nonkapibara:20190209110315p:plain

 

6.キャラクターを全選択して「編集モード」にすると、展開ができている事が確認できる。

f:id:nonkapibara:20190209110448p:plain

 

7.「新規画像」で、画像を保存する

f:id:nonkapibara:20190209110617p:plain

f:id:nonkapibara:20190209110716p:plain

f:id:nonkapibara:20190209110741p:plain

 

10.「ノードエディター」を選択する

f:id:nonkapibara:20190209110827p:plain

 

11.キャラクターのマテリアルを、画像を追加していく

f:id:nonkapibara:20190209110923p:plain

12.「追加」ー「テクスチャ」ー「画像テクスチャ」

f:id:nonkapibara:20190209111023p:plain

13.先程、保存した画像を選択する

f:id:nonkapibara:20190209111125p:plain

f:id:nonkapibara:20190209111213p:plain

順番に、同じように、画像テクスチャーを追加していく

f:id:nonkapibara:20190209111303p:plain

 

16.ベイク処理に進む。

①レンダーを選択する。

②ベイクタイプを「ディフューズ」にする

③直接照明OFF ④間接照明OFF

⑤余白を小さくする

⑥ベイクボタンを押す

※Cyclesレンダーになっている事。

f:id:nonkapibara:20190209111541p:plain

f:id:nonkapibara:20190209111352p:plain

 

17. ベイクが終わったら「UV画像エディター」を開く

f:id:nonkapibara:20190209111924p:plain

18.画像を保存する(この画像がUnityへ取り込む際のマテリアル画像となる)

f:id:nonkapibara:20190209112003p:plain

 

19.マテリアルを、画像に差し替える。

カラーを画像テクスチャーにする

f:id:nonkapibara:20190209112110p:plain

f:id:nonkapibara:20190209112151p:plain

f:id:nonkapibara:20190209112242p:plain

f:id:nonkapibara:20190209112351p:plain

 

20.Blenderの設定を確定する

回転や拡大縮小を確定させる。

キャラクターを全選択した状態で

「オブジェクト」ー「展開」ー「回転」を選ぶ

f:id:nonkapibara:20190209112918p:plain

同じように、拡大縮小もする。

f:id:nonkapibara:20190209113122p:plain

f:id:nonkapibara:20190209113142p:plain

 

23.ここからUnityへ取り込む為のエクスポートをする

「ファイル」ー「エクスポート」ー「FBX」を選ぶ

f:id:nonkapibara:20190209112510p:plain

 

 

24.「メイン」タブから選択する

f:id:nonkapibara:20190209112600p:plain

 

25.エクスポートする

それをUnityで取り込む

f:id:nonkapibara:20190209113602p:plain

f:id:nonkapibara:20190209113717p:plain

 

26.マテリアルを作る

f:id:nonkapibara:20190209113834p:plain

f:id:nonkapibara:20190209114017p:plain

27.マテリアルに、Drag&Dropで画像を配置する

f:id:nonkapibara:20190209114253p:plain

 

28.Prefabにマテリアルを設定する。

f:id:nonkapibara:20190209114541p:plain

 

完成!!

f:id:nonkapibara:20190209120759p:plain

 

【Blender】UV Texture Atlasを追加する

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Blender v2.79.6

⭐️Mac Book

 

1.「ファイル」ー「ユーザー設定」を選ぶ

f:id:nonkapibara:20190207234105p:plain

 

2.「アドオン」ー「UV Texture Atlas」を追加する

f:id:nonkapibara:20190207234146p:plain

3.レンダーの最後尾に追加される。

f:id:nonkapibara:20190207234238p:plain

 

【Blender】重なった箇所を削除する(ブーリアン)

耳と顔をくっつけて、重なった、耳の箇所を削除する。

f:id:nonkapibara:20190207221058p:plain

 

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Blender v2.79.6

⭐️Mac Book

1.削除する方の耳側を選択した状態で、モディファイアー「追加」を選びます。

f:id:nonkapibara:20190207221129p:plain

 

2.「ブーリアン」を選択する

f:id:nonkapibara:20190207221256p:plain

3.「差分」を選んで、重なる方の顔側を選んで、「適用」ボタンを押す。

そうすると、耳と顔が重なった耳側の部分が無くなります!

f:id:nonkapibara:20190207221336p:plain

 

 

 

 

 

 

【Unity】木に衝突すると爆発のパーティクルを発生させ、プレイヤーを爆風で飛ばす

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Unity 2018.2.15f1

実際に動かした動画はこちら↓↓

https://twitter.com/nonnonkapibara/status/1089212339746877440

 

1.🌲🌲Tree)側に「Particle System」を追加する

f:id:nonkapibara:20190127024852p:plain



2.Shapeを設定する

f:id:nonkapibara:20190127024916p:plain



3.Rendererを設定する

f:id:nonkapibara:20190127024934p:plain



パーティクルの画像を設定する

4.Treeタグを設定する。

f:id:nonkapibara:20190127024950p:plain



RigdbodyIs Kinematic チェックON

ColliderIs TriggerチェックON

5.プレイヤー側、Character Controllerを設定する

f:id:nonkapibara:20190127025015p:plain



6.キャラクターにライトを設定する(Point Light

f:id:nonkapibara:20190127025045p:plain

 

🌲木(Tree)側のスクリプト🌲

TreeScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TreeScript : MonoBehaviour {
    private ParticleSystem particle;
    bool HitPlayFlag = false; //衝突有無(衝突イベント開始true)

    // Use this for initialization
    void Start()
    {
        //パーティクル
        particle = this.GetComponent<ParticleSystem>();
        particle.Stop();

    }

    // Update is called once per frame
    void Update () {
    }
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Player")
        {
            Debug.Log("Tree OnTriggerEnter");
            //パーティクルを表示する
            particle.Play();
            // 衝突イベント開始 
            HitPlayFlag = true;
        }
    }
    void LateUpdate()
    {
        //このゲームオブジェクトのパーティクルが生存しているかどうか.
        if (HitPlayFlag && !particle.IsAlive())
        {
            // 衝突イベント終了 
            HitPlayFlag = false;
            Destroy(gameObject);

        }
    }
}

 

CaracterTry04Script

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

public class CaracterTry04Script : MonoBehaviour
{
    [SerializeField] float HitFlaySpeed = 0.5f; // 飛ばされるスピード
    [SerializeField] float HitCycleTime = 0.7f; //飛ばされる時間(ゲーム中断時間)
    float suspendTime = 0.0f;
    private ParticleSystem particle;
    private Vector3 playerPosition;
    bool HitPlayFlag = false; //衝突有無(衝突イベント開始true)

    void Start()
    {
        suspendTime = HitCycleTime;
    }

    void Update()
    {
        if (HitPlayFlag && IsSuspend())
        {
            //衝突イベント開始で、ゲーム中断中の場合、プレイヤーを上に吹き飛ばす
            suspendTime -= Time.deltaTime;
            Vector3 pos = this.gameObject.transform.position;
            this.gameObject.transform.position = new Vector3(pos.x + 0.5f, pos.y + HitFlaySpeed, pos.z);
        }
        else
        {
            // 衝突イベント中
            if (HitPlayFlag)
            {
                // 衝突イベント終わり
                HitPlayFlag = false;
                // 衝突した場所まで戻る
                Vector3 pos = playerPosition;
                this.gameObject.transform.position = new Vector3(pos.x, pos.y, pos.z);
            }
        }


    }

    public bool IsSuspend()
    {
        return suspendTime > 0.0f;
    }

    /*
     * OnTriggerEnter
     * 木と衝突した時に発生するイベント
    */
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Tree")
        {
            // 現在位置を保存
            playerPosition = this.gameObject.transform.position;
            // 衝突イベント開始 
            HitPlayFlag = true;
            suspendTime = HitCycleTime;
        }
    }

}

 完成!!!!

f:id:nonkapibara:20190127030627p:plain

 

 

 

 

Assetsは

KTK Effect Sample Set

を使用しました。

f:id:nonkapibara:20190126013138p:plain

 

 

 

 

 

【Unity】チェリーを取るとパーティクル飛ばすOnTriggerEnterイベント

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Unity 2018.2.15f1

 

実際に動かした動画はこちら↓↓

https://twitter.com/nonnonkapibara/status/1088830093135237122

 

 

1.プレイヤー側にパーティクルを追加する

f:id:nonkapibara:20190126011426p:plain

2.「Particle System」コンポーネントを追加する

f:id:nonkapibara:20190126011540p:plain

3.パーティクルが表示される

f:id:nonkapibara:20190126011658p:plain

4.「Renderer」を開く

f:id:nonkapibara:20190126011759p:plain5.「Material」を選択する

f:id:nonkapibara:20190126011902p:plain

6.パーティクルを選択する

f:id:nonkapibara:20190126011948p:plain


7.「Shape」を選択し、Radiusを1.5にする

f:id:nonkapibara:20190126012105p:plain

8.Emissionを選択する

Rate over Timeを0にし、Rate over Distanceを0にする

Countを30にする

f:id:nonkapibara:20190126012231p:plain

9.Durationを1.0にする(エフェクトの再生時間)

Start Lifetime を0.5にする(パーティクルの表示時間)

f:id:nonkapibara:20190126012416p:plain

 

10.Play On AwakeをチェックOFFにする(起動時にパーティクル表示しないようになる)

f:id:nonkapibara:20190126012536p:plain

11.Looping チェックOFF

f:id:nonkapibara:20190126012709p:plain

12.アイテム側(チェリー🍒)

f:id:nonkapibara:20190126012759p:plain

13.プレイヤー側

f:id:nonkapibara:20190126012833p:plain

 

void Start()
{
    //パーティクル
    particle = this.GetComponent<ParticleSystem>();
    particle.Stop();
}

省略

    void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Cherry")
    {
        Debug.Log("OnTriggerEnter");
        //パーティクルを表示する
        particle.Play();
        // チェリーを削除する
        Destroy(other.gameObject);
    }
}

 

完成!!

f:id:nonkapibara:20190126013713p:plain



 

 

Assetsは

KTK Effect Sample Set

を使用しました。

f:id:nonkapibara:20190126013138p:plain