티스토리 뷰
🕹️ 실습 (2D 횡스크롤 스테이트머신)
Enemy StateMachine
// Idle과 MoveState가 SkeletonGroundedState을 상속받음
public class SkeletonGroundedState : EnemyState
{
protected Skeleton enemy;
protected Transform player;
public SkeletonGroundedState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Skeleton _enemy)
: base(_enemyBase, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Eneter()
{
base.Eneter();
player = GameObject.FindGameObjectWithTag("Player").transform;
}
public override void Update()
{
base.Update();
if (enemy.IsPlayerDetected() || Vector2.Distance(enemy.transform.position, player.position) < 2)
{
stateMachine.ChangeState(enemy.battleState);
}
}
public override void Exit()
{
base.Exit();
}
}
public class SkeletonBattleState : EnemyState
{
Skeleton enemy;
private int moveDir;
private Transform player;
public SkeletonBattleState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Skeleton _enemy)
: base(_enemyBase, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Eneter()
{
base.Eneter();
player = player = GameObject.FindGameObjectWithTag("Player").transform;
}
public override void Update()
{
base.Update();
if (enemy.IsPlayerDetected())
{
stateTimer -= enemy.battleTime;
if (enemy.IsPlayerDetected().distance < enemy.attackDistance)
{
if (CanAttack())
{
stateMachine.ChangeState(enemy.attackState);
}
return;
}
}
else
{
if (stateTimer < 0 || Vector2.Distance(player.transform.position, enemy.transform.position) > 7)
{
stateMachine.ChangeState(enemy.idleState);
}
}
moveDir = player.position.x > enemy.transform.position.x ? 1 : -1;
enemy.SetVelocity(enemy.moveSpeed * moveDir, rb.linearVelocityY);
}
public override void Exit()
{
base.Exit();
}
private bool CanAttack()
{
if (Time.time >= enemy.lastTimeAttacked + enemy.attackColldown)
{
enemy.lastTimeAttacked = Time.time;
return true;
}
return false;
}
}
public class SkeletonAttackState : EnemyState
{
protected Skeleton enemy;
public SkeletonAttackState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Skeleton _enemy)
: base(_enemyBase, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Eneter()
{
base.Eneter();
}
public override void Update()
{
base.Update();
enemy.SetZeroVelocity();
if (triggerCalled)
{
stateMachine.ChangeState(enemy.battleState);
}
}
public override void Exit()
{
base.Exit();
enemy.lastTimeAttacked = Time.time;
}
}
공중 플랫폼
- 밑에서 막히지 않고 올라갈 수 있게 한다 (https://unitybeginner.tistory.com/105)
레이어 별 조명 적용
- Sorting Layer를 이용해서 각각 빛을 따로 줄 수 있다
오브젝트 조명 적용
public class SinWaveLight : MonoBehaviour
{
public float speed = 1.0f; // 속도 조절
public float scaleFactor = 0.02f; // 크기 변화량
private Vector3 initialScale;
void Start()
{
initialScale = transform.localScale;
}
void Update()
{
float time = Time.time * speed; // 시간에 속도를 곱함
float sinValue = Mathf.Sin(time); // 사인 함수 적용
float scaleChange = sinValue * scaleFactor; // 스케일 변화량 계산
transform.localScale = initialScale + new Vector3(scaleChange, scaleChange, scaleChange); // 모든 축에 변화 적용
}
}
'Unity > 멋쟁이사자처럼' 카테고리의 다른 글
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 36일차 회고 (0) | 2025.04.17 |
---|---|
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 35일차 회고 (0) | 2025.04.17 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 33일차 회고 (0) | 2025.04.09 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 32일차 회고 (0) | 2025.04.09 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 31일차 회고 (0) | 2025.04.07 |