// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using UnityEngine;
namespace MagicaCloth
{
///
/// 形状風
///
//[HelpURL("https://magicasoft.jp/directional-wind/")]
[AddComponentMenu("MagicaCloth/MagicaAreaWind")]
public partial class MagicaAreaWind : WindComponent
{
[SerializeField]
private PhysicsManagerWindData.ShapeType shapeType = PhysicsManagerWindData.ShapeType.Box;
[SerializeField]
private bool isAddition = false;
//=========================================================================================
public override ComponentType GetComponentType()
{
return ComponentType.AreaWind;
}
///
/// 風タイプを返す
///
///
public override PhysicsManagerWindData.WindType GetWindType()
{
return PhysicsManagerWindData.WindType.Area;
}
///
/// 形状タイプを返す
///
///
public override PhysicsManagerWindData.ShapeType GetShapeType()
{
return shapeType;
}
///
/// 風向きタイプを返す
///
///
public override PhysicsManagerWindData.DirectionType GetDirectionType()
{
if (shapeType == PhysicsManagerWindData.ShapeType.Box)
return PhysicsManagerWindData.DirectionType.OneDirection;
else
return directionType;
}
///
/// 風が加算モードか返す
///
///
public override bool IsAddition()
{
return isAddition;
}
///
/// エリアサイズを返す
///
///
public override Vector3 GetAreaSize()
{
if (shapeType == PhysicsManagerWindData.ShapeType.Box)
return areaSize;
else if (shapeType == PhysicsManagerWindData.ShapeType.Sphere)
return new Vector3(areaRadius, areaRadius, areaRadius);
Debug.LogError("Invalid wind shape type!");
return Vector3.zero;
}
///
/// アンカー位置を返す
///
///
//public override Vector3 GetAnchor()
//{
// return anchor;
//}
///
/// 風エリアの体積を返す
///
///
public override float GetAreaVolume()
{
if (shapeType == PhysicsManagerWindData.ShapeType.Box)
return (areaSize.x * 2) * (areaSize.y * 2) * (areaSize.z * 2);
else if (shapeType == PhysicsManagerWindData.ShapeType.Sphere)
return (4.0f / 3.0f) * areaRadius * areaRadius * areaRadius * Mathf.PI;
Debug.LogError("Invalid wind volume!");
return 0;
}
///
/// 風エリアの最大距離を返す
///
///
public override float GetAreaLength()
{
// 基本はエリアサイズの対角線距離、アンカーが離れていればその分水増しする
var size = GetAreaSize();
var areaLength = shapeType == PhysicsManagerWindData.ShapeType.Sphere ? size.x : size.magnitude;
//var anchorRatio = Mathf.Clamp01(anchor.magnitude);
//return areaLength + areaLength * anchorRatio;
return areaLength;
}
//=========================================================================================
///
/// パラメータ初期化
///
protected override void ResetParams()
{
main = 5;
turbulence = 1;
frequency = 1;
areaSize = new Vector3(5, 5, 5);
//anchor = Vector3.zero;
directionAngleX = 0;
directionAngleY = 0;
directionType = PhysicsManagerWindData.DirectionType.OneDirection;
attenuation.SetParam(1, 1, false, 0, false);
}
}
}