Unity スクリプトで「ふわふわの物にのっかってポヨンとさせてみる」（雲にのった感じ）

<h2>Unityで雲にのっかったときのようなポヨンとする表現を単純に実装</h2>
![munifuwa.gif](https://qiita-image-store.s3.amazonaws.com/0/69972/63112418-db81-a050-63c6-a9e50933a6b6.gif)

[GitHubのプロジェクト]("https://github.com/hmcGit/FuwaMuni)
プロジェクトはgitにもあります。

こんなかんじで、ふわふわしたものにのっかったときに、ぽよん！とさせたいときに！
スクリプトでのごく簡単な実装です。


※ふわふわスクリプトは
[Unityふわふわ浮いているようにする]("http://veniegames.com/?p=21)
を参考にしました。

<h3>スクリプト解説</h3>

<h5>ふわふわ、ぽよんとするオブジェクト</h5>

雲などのふわふわ動いて、のっかるとぽよんとするオブジェクトにアタッチします。RigidBody2Dとコライダーも忘れずに

<a href="http://www.alice3.net/wp-content/uploads/2016/12/cloud.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/12/cloud-300x219.jpg" alt="cloud" width="300" height="219" class="alignnone size-medium wp-image-3231" /></a>

FixedUpdate()のFuwaFuwa()がふわふわ漂うスクリプト（これは参考URLのものです）
OnCollisionEnter2D()がコリジョンに接触したらよびだされますが、
MuniMuni()がぽよんとさせるスクリプトです。
MuniMuni関数内で
`coll.transform.SetParent(this.transform)`

としていますが、これでプレイヤーと雲を親子にし連続で小刻みにボヨボヨするのを防いでいます。
<h5>CloudControl.cs</h5>

```
using UnityEngine;
using System.Collections;

public class CloudControl : MonoBehaviour {

    int frameCnt = 0;           //フレームカウント
    float amplitude = 0.015f;   //振幅

    void FixedUpdate()
    {
        FuwaFuwa();
    }
    /// <summary>
    /// ふわふわ動かす
    /// </summary>
    void FuwaFuwa()
    {
        frameCnt += 1;
        
        if (10000 <= frameCnt) {
            frameCnt = 0;
        }
        if (0 == frameCnt % 2) {
            // 上下に振動させる（ふわふわを表現）
            float posYSin = Mathf.Sin(2.0f * Mathf.PI * (float)(frameCnt % 200) / (200.0f - 1.0f));
            iTween.MoveAdd(gameObject, new Vector3(0, amplitude * posYSin, 0), 0.0f);
        }
    }
    /// <summary>
    /// なにかが乗っかったらむにむにさせる
    /// </summary>
    /// <returns></returns>
    IEnumerator MuniMuni()
    {

        Vector3 ds = transform.localPosition;

        //すこしyポジションを動かしてむにっとした感じにする
        for (int i = 0; i <= 180; i += 20)
        {
            transform.localPosition = new Vector3(
                ds.x,
                ds.y - 0.5f * (Mathf.Sin(i * Mathf.Deg2Rad)),
                1);

            yield return new WaitForFixedUpdate();// WaitForSeconds(0.016f);
        }
    }
    void OnCollisionEnter2D(Collision2D coll)
    {
        //コリジョンにEnterしたらむにむにさせる
        StartCoroutine(MuniMuni());
        coll.transform.SetParent(this.transform);
    }

}

```



<h5>ふわふわにのっかるオブジェクト</h5>
プレイヤーキャラクターなどの、雲などにのっかる方にはこちらをアタッチして下さい。
<a href="http://www.alice3.net/wp-content/uploads/2016/12/player.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/12/player-300x226.jpg" alt="player" width="300" height="226" class="alignnone size-medium wp-image-3241" /></a>
キャラクターには、RigidBody2dとコライダーのアタッチも忘れずに。
ポイントは、キャラクタの操作でジャンプした瞬間に、雲に設定していたParentを解除しているところです。
`this.transform.SetParent(null)`

```
<h5>PlayerContro.cs</h5>
<pre>
using UnityEngine;
using System.Collections;

public class PlayerControl : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            this.transform.SetParent(null);
            this.transform.GetComponent<Rigidbody2D>().AddForce(Vector2.up * 10.0f, ForceMode2D.Impulse);
        }
	}
}
```