게임 내에서 플레이어나 여러 오브젝트들은 다양한 상황에서 피해를 받을 수 있다. 약한 공격은 큰 충격이 없지만 강한 공격은 뒤로 밀려나거나 날아가는 등 역동적인 연출을 할 필요가 있다. Rigidbody의 AddForce를 이용하여 간단하게 구현할 수 있다.
구현 아이디어?
밀려나는 효과는 Rigidbody 의 AddForce 함수를 이용하여 구현할 수 있다. 특정 스크립트가 필요한것이 아닌 공격을 주거나, 공격을 받는 과정의 함수 내에 코드를 추가해주면 간단하게 구현할 수 있다. 공격을 받는 쪽보다는 공격을 주는 방향의 함수 내에 코드를 추가하는것이 더욱 좋아보인다. 이유는 공격을 하는 주체의 트랜스폼 방향이 필요하기 때문이다.
//GolemController.cs
...
public class GolemController : MonoBehaviour
{
...
//플레이어의 오브젝트
[Header("Player OBJ")]
[SerializeField] private GameObject mPlayerObj;
//Attack2(돌진공격)에서 대상을 물리적으로 밀칠때의
[SerializeField] private float mAttack2PushPower;
...
private void OnCollisionEnter(Collision collision)
{
if (misAtt_Dash)
{
...
if (collision.transform.CompareTag("Player"))
{
misAtt_Dash = false;
mState = State.REACTION_HIT;
mAtt_Cooldown_Dash += 5.0f;
misGettingHit = true;
mAnim.SetTrigger("ReactionHit");
mProjector_Dash.gameObject.SetActive(false);
//플레이어에게 피해를 입힌다. 체력을 깎음.
mPlayerObj.GetComponent<PlayerController>().HitPlayer(mGolemDamage);
//플레이어를 골렘의 공격 방향으로 밀어낸다.
mPlayerObj.GetComponent<Rigidbody>().AddForce((transform.forward + transform.up) * mAttack2PushPower, ForceMode.Impulse);
}
}
}
...
}
|
cs |
씬 내의 골렘의 이동이나 공격을 담당하는 GolemController.cs이다. 골렘 컨트롤러의 공격 함수 내에 RigidBody.AddForce를 통해 대상을 밀쳐낸다.
[SerializeField] private GameObject mPlayerObj;
- 골렘이 공격하고자 하는 플레이어의 캐릭터 오브젝트이다. mPlayerObj에는 Rigidbody 컴포넌트가 들어있어야한다.
mPlayerObj.GetComponent<Rigidbody>().AddForce(...);
- OnCollisionEnter()로 콜리전 충돌을 Player의 태그로 시작했을 때, 플레이어를 밀어낸다.
- AddForce를 통해 mPlayerObj의 RigidBody에 힘을 주게 된다.
- 힘을 주는 방향은 GolemController.cs가 붙어있는 골렘 오브젝트가 바라보는 방향(돌진 방향)인 transform.forward를 mAttack2PushPower만큼 곱해 힘을 주면 된다.
- transform.forward에 transform.up을 더한 이유는 transform.forward의 방향이 x축과 평행할경우 밀어내기와 동시에 바닥에 닿기때문에 밀어내는 효과가 시원하게 보여지지 않기에 위로 뜨는것도 추가하였다. 이것은 선택사항이다.
- ForceMode.Impulse는 ForceMode의 모드 중 하나로 순간적인 힘을 주는 모드이다. 대상을 밀어내는데 힘을 주는 모드는 Impulse 모드가 가장 적절하다고 판단하여 사용하였다.
ForceMode에 대한 유니티 문서이다.
Force | 질량을 사용하여 강체에 연속적인 힘을 추가합니다. |
Acceleration | 질량을 무시하고 강체에 연속 가속을 추가합니다. |
Impulse | 질량을 사용하여 강체에 순간적인 힘 충격을 추가합니다. |
VelocityChange | 질량을 무시하고 강체에 즉각적인 속도 변경을 추가합니다. |
'unity game modules' 카테고리의 다른 글
[유니티] 오브젝트와 UI에 gif 이미지 출력 (0) | 2022.07.17 |
---|---|
[유니티] 번개 효과 (0) | 2022.07.17 |
[유니티] 카메라 흔들림 효과 (0) | 2022.07.17 |
[유니티] 안개 효과 (던전 입장 효과) (0) | 2022.07.16 |
[유니티] 3인칭 움직이기 (0) | 2022.07.16 |