LiMMの溶解記録

脳を溶かすようなゲームを。

おっぱい揺らそう

みんな大好き私も大好きな『乳揺れ』を簡単に。

乳揺れしたい。

2Dゲームを作っていて、もっと楽に乳揺れが出来たらなぁと思いませんか?

私は思います。あと私の知り合いも全員思っているし、あなたの知り合いも全員思っています。

知らないのはあなただけ。

例えば移動から停止の時にプルルンとなったりしたら嬉しいなぁとか。

 

そういうのはコンポーネントとして作っちゃえば、なんかいろいろ使えますよね。

ということで作りました。

正直クソみたいなコードなのでそのまま下の方に貼っておきます。

その前にどんな感じになるかだけ見てください。

 

なかなかパインパインしていませんか?

特に上昇する時にちょっと細くなるところとか、そこからまた形が戻るところとか、こう、揉みたくなりませんか?

私はなります。あと私の知り合いも全員揉みたくなってるし、あなたの知り合いも全員なっています。

あなたもなります。

副産物

 使い方次第ではこういうロボット系にも使えそうですね(ハナホジ)

 

ではお待ちかねのソースコードですが、リファクタリングとかパラメータの洗い出しなおしとか全くやってないコードなので、あなたがやってください。

私の知り合いも全員やってるし、あなたの知り合いも全員やっています。

やってないのはあなただけ。

そんなのを晒すなんて、例えてみれば私室のゴミ箱の中身を友達に見せるようなものです。私の勇気を末代まで讃えてください。え?もう末代?

 

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

public class SpriteSway : MonoBehaviour {
[SerializeField]
Vector2 m_minScale = Vector2.zero;

[SerializeField]
Vector2 m_maxScale = Vector2.one;

[SerializeField]
float m_minAngle = -10.0f;

[SerializeField]
float m_maxAngle = 10.0f;

[SerializeField]
Vector2 m_minTransrate = Vector2.zero;

[SerializeField]
Vector2 m_maxTransrate = Vector2.zero;

const float m_maxPowerLength = 1.0f;

Vector3 m_defaultScale = Vector3.zero;
Vector3 m_defautlRotation = Vector3.zero;
Vector3 m_defaultPosition = Vector3.zero;

Vector3 m_power = Vector3.zero;
Vector3 m_powerWork = Vector3.zero;
Vector3 m_prevPosition = Vector3.zero;
float m_sinValue = 0.0f;

enum State {
STATE_IDLE,
STATE_MOVE,
STATE_SWAY,
}
State m_state = State.STATE_IDLE;

public void AddImpulse(Vector3 power)
{

}

// Use this for initialization
void Start () {
m_prevPosition = transform.position;
m_defaultScale = transform.localScale;
m_defautlRotation = transform.eulerAngles;
m_defaultPosition = transform.localPosition;
m_minTransrate += (Vector2)m_defaultPosition;
m_maxTransrate += (Vector2)m_defaultPosition;
}

// Update is called once per frame
void Update () {
switch (m_state) {
case State.STATE_IDLE: {
if (IsMove()) {
m_state = State.STATE_MOVE;
}
break;
}

case State.STATE_MOVE: {
if (UpdatePower()) {
m_state = State.STATE_SWAY;
m_powerWork = m_power;
m_sinValue = Mathf.PI;
}
break;
}

case State.STATE_SWAY: {
if (ReducePower()) {
m_state = State.STATE_IDLE;
}
Sway();

if (IsMove()) {
m_state = State.STATE_MOVE;
}
break;
}
}
UpdateShape();
m_prevPosition = transform.position;
Debug.DrawLine(transform.position, transform.position + m_power, Color.red);
}

bool UpdatePower()
{
Vector3 diff = m_prevPosition - transform.position;
if (diff.magnitude < 0.001f) {
return true;
}
AddPower(diff * 2.0f);
return false;
}

void AddPower(Vector3 power)
{
m_power += power;
float length = Mathf.Min(m_power.magnitude, m_maxPowerLength);
m_power = m_power.normalized * length;
}

bool ReducePower()
{
m_powerWork *= 0.98f;
if (m_powerWork.magnitude < 0.001f) {
m_powerWork = Vector3.zero;
return true;
}
return false;
}

void Sway()
{
m_sinValue += 2.0f * Mathf.PI * 2.0f * Time.deltaTime;
m_power = m_powerWork * Mathf.Sin(m_sinValue);
}

bool IsMove()
{
Vector3 diff = m_prevPosition - transform.position;
if (diff.magnitude > 0.001f) {
return true;
}
return false;
}

void UpdateShape()
{
// 回転.
{
Vector3 rotation = transform.eulerAngles;
float power = m_power.x;
float ratio = Mathf.Abs(power) / m_maxPowerLength;
if (power > 0.0f) {
rotation.z = m_defautlRotation.z + (m_maxAngle - m_defautlRotation.z) * ratio;
} else if (power < 0.0f) {
rotation.z = m_defautlRotation.z - (m_defautlRotation.z - m_minAngle) * ratio;
}
transform.eulerAngles = rotation;
}

// スケール.
{
Vector3 scale = transform.localScale;
float power = m_power.y * -1.0f;
float ratio = Mathf.Abs(power) / m_maxPowerLength;
if (power > 0.0f) {
scale.y = m_defaultScale.y + ((m_maxScale.y - m_defaultScale.y) * ratio);
scale.x = m_defaultScale.x - ((m_defaultScale.x - m_minScale.x) * ratio);
} else if (power < 0.0f) {
scale.y = m_defaultScale.y - ((m_defaultScale.y - m_minScale.y) * ratio);
scale.x = m_defaultScale.x + ((m_maxScale.x - m_defaultScale.x) * ratio);
}
transform.localScale = scale;
}

// 位置.
{
Vector3 pos = transform.localPosition;
{
float ratioX = Mathf.Abs(m_power.x) / m_maxPowerLength;
if (m_power.x < 0.0f) {
pos.x = m_defaultPosition.x - ((m_defaultPosition.x - m_minTransrate.x) * ratioX);
} else if (m_power.x > 0.0f) {
pos.x = m_defaultPosition.x + ((m_maxTransrate.x - m_defaultPosition.x) * ratioX);
}
}

{
float ratioY = Mathf.Abs(m_power.y) / m_maxPowerLength;
if (m_power.y < 0.0f) {
pos.y = m_defaultPosition.y - ((m_defaultPosition.y - m_minTransrate.y) * ratioY);
} else if (m_power.y > 0.0f) {
pos.y = m_defaultPosition.y + ((m_maxTransrate.y - m_defaultPosition.y) * ratioY);
}
Debug.Log("ratioY : " + ratioY);
Debug.Log("m_power.y : " + m_power.y);
Debug.Log("m_defaultPosition.y : " + m_defaultPosition.y);
}
transform.localPosition = pos;
}
}
}

 

インデントが無いのは引用で貼り付けたらスペースが全部消えてしまったためであり、普段からこんなモノを書いている訳じゃあないです。許してください。あなたの知り合いも全員許していますので。

 

以上です。

よろしくお願い致します。