본문 바로가기

개발자_뉴비일지

내일배움캠프 Unity 24일차 TIL - null

string keyword="null";

1.알고리즘 코드 카타

 

(1) 평균 구하기

 

<나의 솔루션>

>>배열의 평균 구하기 배끼기!

 

(2) 자릿수 더하기

 

<나의 솔루션>

public int solution(int n)
{
    int answer = 0;
     while(n>0)
    {
        answer += n % 10;
        n= n/10;
    }

    return answer;
}

처음엔 각 자릿수를 따와서 각각 더하려고 생각중이었는데 검색의 도움을 좀 받아볼까 하다가 신박한 방법 발견ㄷㄷ

어케생각했누..

예전에 카드게임 만들 때 카드 배열 구현할 때 정도의 신박함이었다.

 

2. TopDownShooting

 

(1) 적 구현하기

 

<GameManager>

public class GameManager : MonoBehaviour
{
    public static GameManager Instance; //싱글톤화

    public Transform Player {  get; private set; }
    [SerializeField] private string playerTag = "Player";

    private void Awake()
    {
        Instance = this;
        Player = GameObject.FindGameObjectWithTag(playerTag).transform;
    }
}

 

<TopDownEnemyController>

public class TopDownEnemyController : TopDownCharacterController
{
    GameManager gameManager;

    protected Transform ClosestTarget { get; private set; }

    protected override void Awake()
    {
        base.Awake();
    }

    protected virtual void Start()
    {
        gameManager = GameManager.Instance;
        ClosestTarget = gameManager.Player; //가까운 타겟을 플레이어로 잡을 수 있음.
    }

    protected virtual void FixedUpdate()
    {

    }

    protected float DistanceToTarget()
    {
        return Vector3.Distance(transform.position, ClosestTarget.position);
    }
    protected Vector2 DirectionToTarget()
    {
        return (ClosestTarget.position - transform.position).normalized;
    }

}

 

<TopDownContactEnemyController>

public class TopDownContactEnemyController : TopDownEnemyController
{

    [SerializeField][Range(0f, 100f)] private float follwRange;
    [SerializeField] private string targetTag = "Player";
    private bool _isCollingWithTarget;

    [SerializeField] private SpriteRenderer characterRenderer;

    protected override void Start()
    {
        base.Start();    
    }

    protected override void FixedUpdate()
    {
        base.FixedUpdate();

        Vector2 direction = Vector2.zero;
        if(DistanceToTarget() <  follwRange)
        {
            direction = DirectionToTarget();
        }

        CallMoveEvent(direction);
        Rotate(direction);
    }

    private void Rotate(Vector2 direction)
    {
        float rotZ = Mathf.Atan2(direction.y, direction.x);
        characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;
        
    }

}

 

플레이어를 만들 때와 동일한 방식으로 고블린하나를 만들어 주고 플레이어를 타겟으로 움직일 수 있게 만든다.

펫처럼 잘 따라다닌다.

 

< TopDownRangeEnemyContreoller >

public class TopDownRangeEnemyController : TopDownEnemyController
{
    [SerializeField] private float follwRange = 15f;
    [SerializeField] private float shootRange = 10f;

    protected override void FixedUpdate()
    {
        base.FixedUpdate();

        float distance = DistanceToTarget();
        Vector2 direction = DirectionToTarget();

        IsAttacking = false;
        if (distance <= follwRange)
        {
            if (distance <= shootRange)
            {
                int layerMaskTarget = Stats.CurrentStats.attackSO.target;
                RaycastHit2D hit = Physics2D.Raycast(transform.position, direction, 11f, (1 << LayerMask.NameToLayer("Level)")) | layerMaskTarget);
                //몬스터와 플레이어 사이에 막혀있는 지형이 있는지 검사하는 코드

                if (hit.collider != null && layerMaskTarget == (layerMaskTarget | (1 << hit.collider.gameObject.layer)))
                {
                    CallLookEvent(direction);
                    CallMoveEvent(Vector2.zero);
                    IsAttacking = true;
                }
                else
                {
                    CallMoveEvent(direction);
                }
            }
            else
            {
                CallMoveEvent(direction);
            }
        }
        else
        {
            CallMoveEvent(direction);
        }
    }

}

>>원거리 몬스터를 위한 스크립트.

 

>>플레이어를 향해 공격을 한다!

 

3. 팀프로젝트

 

(1)몬스터 스폰 및 이동

 

처음엔 중력을 아래 말고 양 옆으로 받게 해서 떨어뜨릴 순 없을까 고민했었는데 rigidbody에 그런 기능은 없는 것 같았다.

예전에 빗방울게임이나 고양이 밥주기 게임에서 배운 것을 참고하여 만들어보았다.

 

<MonsterMoveController>

 void Start()
 {
     //오른쪽, 왼쪽 Y축에 랜덤 생성

     float x = 9.3f;
     float y = Random.Range(-4.3f, 4.5f);

     transform.position = new Vector3(x, y, 0);
 }
 void Update()
 {
     //오른족 또는 왼쪽으로 일정속도(랜덤속도도 가능)로 움직임 업데이트
     transform.position += new Vector3(-0.03f, 0, 0);
     if(transform.position.x<-9.4f)
     {
         Destroy(gameObject);
     }
 }

>>아직은 에셋이 없어 보기 숭하지만, 오른쪽 랜덤 y축에서 생겨서 왼쪽으로 일정 속도로 가다가 화면밖으로 나가면 사라진다.

 

마무리

x값을 범위가 아닌 두개로 고정하고 둘중 하나로 랜덤하게 생성시켜야 하는데 이걸 어떻게 해야할 지 고민이 됐다.

튜터님이 몬스터 매니저를 만들어 스폰포지션을 두개 만들어 두라고 하셔서 내일 구현해 볼 생각이다.

몬스터 자체가 가지는 속성들을 고려하고 몬스터들을 관리할 매니저가 가져야 할 것들을 구분해봐야겠다.

 

 

.

.

.

with 용이