게임 내에서 플레이어나 여러 오브젝트들은 다양한 상황에서 피해를 받을 수 있다. 약한 공격은 큰 충격이 없지만 강한 공격은 뒤로 밀려나거나 날아가는 등 역동적인 연출을 할 필요가 있다. 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에 대한 유니티 문서이다.
Unity - Scripting API: ForceMode
The AddForce function impacts how your GameObject moves by allowing you to define your own force vector, as well as choosing how to apply this force to the GameObject (this GameObject must have a Rigidbody component attached). ForceMode allows you to choos
docs.unity3d.com
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 |