Unityで雲にのっかったときのようなポヨンとする表現を単純に実装
GitHubのプロジェクト
プロジェクトはgitにもあります。
こんなかんじで、ふわふわしたものにのっかったときに、ぽよん!とさせたいときに!
スクリプトでのごく簡単な実装です。
※ふわふわスクリプトは
Unityふわふわ浮いているようにする
を参考にしました。
スクリプト解説
ふわふわ、ぽよんとするオブジェクト
雲などのふわふわ動いて、のっかるとぽよんとするオブジェクトにアタッチします。RigidBody2Dとコライダーも忘れずに
FixedUpdate()のFuwaFuwa()がふわふわ漂うスクリプト(これは参考URLのものです)
OnCollisionEnter2D()がコリジョンに接触したらよびだされますが、
MuniMuni()がぽよんとさせるスクリプトです。
MuniMuni関数内で
coll.transform.SetParent(this.transform)
としていますが、これでプレイヤーと雲を親子にし連続で小刻みにボヨボヨするのを防いでいます。
CloudControl.cs
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);
}
}
ふわふわにのっかるオブジェクト
プレイヤーキャラクターなどの、雲などにのっかる方にはこちらをアタッチして下さい。
キャラクターには、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);
}
}
}