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 용이
'개발자_뉴비일지' 카테고리의 다른 글
내일배움캠프 Unity 26일차 TIL - 목표달성 (0) | 2024.01.29 |
---|---|
내일배움캠프 Unity 25일차 TIL - 타겟 (0) | 2024.01.26 |
내일배움캠프 Unity 23일차 TIL - START TeamProject 02 (1) | 2024.01.24 |
내일배움캠프 Unity 22일차 TIL - 저장 (1) | 2024.01.23 |
내일배움캠프 Unity 21일차 TIL - 사라진 화살 (0) | 2024.01.22 |