public class DamageController : MonoBehaviour
{
public LayerMask targetLayer;
public UnitController mainUnit;
public int damage = 2;
public bool damageTriggerOn;
public bool dealTime;
private void OnTriggerStay(Collider other)
{
if (damageTriggerOn)
{
Debug.Log(other.gameObject.name + " 1");
if (((1 << other.gameObject.layer) & targetLayer) != 0)
{
Debug.Log(other.gameObject.name + " 2");
if (other.TryGetComponent(out UnitController targetUnit))
{
damageTriggerOn = false;
Debug.Log(other.gameObject.name + " 3");
targetUnit.ReceiveAnAttack(damage, mainUnit);
}
}
}
}
public IEnumerator DamageTriggerOn(float dealTime)
{
damageTriggerOn = true;
yield return new WaitForSeconds(dealTime);
damageTriggerOn = false;
yield return null;
}
}
enter로 했더니 이미 범위 안에 있는애들은 딜 안받아서 패스
Stay로 했더니 여러번 딜이 들어와서 타격시 bool로했더니 여러마리가 동시에 공격당했을때 최초의 한놈만 딜받아서 패스
지금 생각하는건 딕션너리를 만들어서 유닛을 키로 넣고 값을 bool로 넣어서 스테이에다가 foreach로 사전돌면서 bool값이 false인놈만 딜주고 true로 바꿀생각인데
스테이에다가 이러면 뭔가 효율성에서 거지같은 느낌이 드네요 ..
무슨 좋은방법 없을까요
컬리더로 체크 하지말고 주인공이랑 몬스터위치의 거리로 판단하는게 어떨까?
칼같은걸로 밀리 공격한다고 가정했을때 칼에 맞은놈들이랑 아닌놈들 판별하는방식을 컬리더말고 다른방식으로 가능할려나요..
3d 게임입니다
맞았을때는 코루틴으로 잠깐 bool 체크해주면 되지않을까요? 저는 그렇게 사용합니다(모바일) 저는 컬리더를 잘 믿지않아요~ 그리고 생각보다 무겁습니다.
Physics.BoxCast
vector3.distance로 반경내에 있으면 처리되게 하셈
난 콜라이더 꺼놨다가 공격할 때만 켜면서 OnEnter로 함.
딕셔너리를 쓰는데 foreach를 왜 써
공격 직전 초기화 딕셔너리에 없으면 판정 들어감 공격 성공 시 딕셔너리에 추가