AnyPortrait > 스크립트 > 물리 효과
Physics 모디파이어로 등록된 물리 효과를 스크립트로 제어할 수 있습니다.
물리 효과를 켜거나 끌 수 있고, 외부의 힘(척력)과 잡아당김(인력)을 추가로 제어할 수 있습니다.
물리 효과를 켜거나 끕니다.
bool isPhysicEnabled : 물리 효과 모디파이어 처리 여부
점을 기준으로 방사형의 힘을 추가합니다.
apForceUnit를 리턴하므로 여기에 속성을 추가하여 힘 생성 요청을 완성합니다.
Vector2 pointPosW : 힘이 가해지는 위치 (World 좌표계)
float radius : 방사형의 힘이 가해지는 반경
apForceUnit : 생성된 힘
직선형의 힘을 추가합니다.
apForceUnit를 리턴하므로 여기에 속성을 추가하여 힘 생성 요청을 완성합니다.
Vector2 directionW : 힘이 가해지는 방향 (World 좌표계)
apForceUnit : 생성된 힘
직선형의 힘을 추가합니다.
X, Y축에 대해 sin곡선을 그리는 반복적인 방향 변화가 있어서 바람과 같은 표현에 적합합니다.
apForceUnit를 리턴하므로 여기에 속성을 추가하여 힘 생성 요청을 완성합니다.
Vector2 directionW : 힘이 가해지는 방향 (World 좌표계)
float waveSizeX : 주기적으로 바뀌는 방향의 최대 X값
float waveSizeY : 주기적으로 바뀌는 방향의 최대 Y값
float waveTimeX : X축에 대해 방향이 바뀌는 주기
float waveTime : Y축에 대해 방향이 바뀌는 주기
apForceUnit : 생성된 힘
현재 추가된 힘이 있는지 리턴합니다.
bool : 추가된 힘이 있는지 여부
입력된 위치에서 계산된 힘을 측정합니다.
Vector2 targetPosW : 측정하고자 하는 위치 (World 좌표계)
Vector2 : 측정된 힘 벡터
AddForce 함수로 추가했던 모든 힘을 없앱니다.
지정된 힘을 제거합니다.
apForceUnit forceUnit : 삭제하고자 하는 힘 데이터입니다. AddForce 함수의 리턴으로서 가져올 수 있습니다.
터치 입력에 의한 "잡아당김"을 시작합니다.
Vector2 posW : 터치 위치 (World 좌표계)
float radius : 잡아당겨지는 반경
apPullTouch : "터치에 의한 잡아당김"에 대한 정보를 가지고 고유한 ID로 구분된 객체
AddTouch 호출 이후에 리턴되었던 apPullTouch에 해당하는 터치의 현재 위치를 갱신합니다.
apPullTouch.TouchID를 파라미터에 넣어서 구분합니다.
int touchID : AddTouch에서 리턴되었던 apPullTouch의 TouchID에 해당하는 ID
Vector2 posW : 현재 터치의 위치
AddTouch 호출 이후에 리턴되었던 apPullTouch에 해당하는 터치의 현재 위치를 갱신합니다.
apPullTouch를 직접파라미터에 넣어서 구분합니다.
apPullTouch touch, : AddTouch에서 리턴되었던 apPullTouch
Vector2 posW : 현재 터치의 위치
현재 추가된 터치가 있는지 리턴합니다.
bool : 추가된 터치가 있는지 여부
touchID에 해당하는 ID를 가진 apPullTouch 객체를 리턴합니다.
int touchID : 찾고자 하는 터치 이벤트의 ID
apPullTouch : 요청한 TouchID를 가지고 있는 잡아당김 터치 이벤트 (없을시 null 리턴)
잡아당김을 계산 중인 터치 이벤트 객체를 제거합니다.
int touchID : AddTouch에서 리턴되었던 apPullTouch의 TouchID에 해당하는 ID
apPullTouch touch : AddTouch에서 리턴되었던 apPullTouch
잡아당김을 계산 중인 모든 터치 이벤트 객체를 제거합니다.
모든 힘과 터치 이벤트 객체를 제거합니다.
AddForce 함수를 그대로 사용하면 힘이 적용되지 않습니다.
AddForce 함수의 리턴값인 apForceUnit에 추가적인 정보를 넣어야 합니다.
SetPower 함수 중 하나를 호출하고, EmitLoop나 EmitOnce중 하나를 호출해야합니다.
public apForceUnit SetPower(float power)
: power 만큼의 힘을 추가합니다.
public apForceUnit SetPower(float power, float waveSize, float waveTime)
: power를 기준으로 waveSize 만큼의 크기가 waveTime 시간만큼 주기적으로 변하는 힘을 추가합니다.
public apForceUnit EmitLoop()
: 지속되는 힘입니다.
public apForceUnit EmitOnce(float liveTime)
: liveTime의 시간 이후에는 사라지는 힘입니다.
using UnityEngine;
using AnyPortrait;
public class PhysicsTest : MonoBehaviour
{
// Target AnyPortrait Object
public apPortrait portrait;
// Touch ID
private int _touchID;
void Start () { }
void Update ()
{
//----------------------------------------
// Force Events
//----------------------------------------
// Clear Force
if(Input.GetKeyDown(KeyCode.C))
{
portrait.ClearForce();
Debug.Log("Clear Force");
}
// Add Point Force
if(Input.GetKeyDown(KeyCode.P))
{
// Position : (0, 0)
// Radius : 10
// Power : 2000
// Live Time : 10 Sec
portrait.AddForce_Point(Vector2.zero, 10.0f)
.SetPower(2000)
.EmitOnce(10);
Debug.Log("Add Point Force");
}
//Add Waved Directional Force
if(Input.GetKeyDown(KeyCode.D))
{
// Direction : (1 +- 0.5, 0.5 +- 0.2)
// Power : 4000 +- 1000
// Loop
portrait.AddForce_Direction(new Vector2(1.0f, 0.5f), 0.5f, 0.2f, 5, 10)
.SetPower(4000, 1000, 25)
.EmitLoop();
Debug.Log("Add Waved Directional Force");
}
//----------------------------------------
// Touch Events
//----------------------------------------
Vector3 touchPosW = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));
Vector2 touchPosW2 = new Vector2(touchPosW.x, touchPosW.y);
//Left Click -> Touch
if(Input.GetMouseButtonDown(0))
{
//Start Touch Event
_touchID = portrait.AddTouch(touchPosW2, 2.0f).TouchID;
Debug.Log("Add Touch (" + _touchID + ")");
}
else if(Input.GetMouseButton(0))
{
//Refresh Touch Position
portrait.SetTouchPosition(_touchID, touchPosW2);
}
else if(Input.GetMouseButtonUp(0))
{
//Release Touch Event
portrait.ClearTouch();
_touchID = -1;
}
}
}