🕹️ 실습 (2D 횡스크롤 스테이트머신)
Background Parallax
public class ParallaxBackground : MonoBehaviour
{
private Camera cam;
[SerializeField] private float parallaxEffect;
private float xPosition;
private float length;
void Start()
{
cam = Camera.main;
length = GetComponent<SpriteRenderer>().bounds.size.x;
xPosition = transform.position.x;
}
void Update()
{
float distanceMoved = cam.transform.position.x * (1 - parallaxEffect);
float distanceToMove = cam.transform.position.x * parallaxEffect;
transform.position = new Vector3(xPosition + distanceToMove, transform.position.y);
if (distanceMoved > xPosition + length)
{
xPosition = xPosition + length;
}
else if (distanceMoved < xPosition - length)
{
xPosition = xPosition - length;
}
}
}
Enemy StateMachine
public class EnemyState
{
protected EnemyStateMachine stateMachine;
protected Enemy enemyBase;
protected bool triggerCalled;
private string animBoolName;
protected float stateTimer;
public EnemyState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName)
{
this.enemyBase = _enemyBase;
this.stateMachine = _stateMachine;
this.animBoolName = _animBoolName;
}
public virtual void Eneter()
{
triggerCalled = false;
enemyBase.anim.SetBool(animBoolName, true);
}
public virtual void Update()
{
stateTimer -= Time.deltaTime;
}
public virtual void Exit()
{
enemyBase.anim.SetBool(animBoolName, false);
}
}
public class EnemyState
{
protected EnemyStateMachine stateMachine;
protected Enemy enemyBase;
protected bool triggerCalled;
private string animBoolName;
protected float stateTimer;
public EnemyState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName)
{
this.enemyBase = _enemyBase;
this.stateMachine = _stateMachine;
this.animBoolName = _animBoolName;
}
public virtual void Eneter()
{
triggerCalled = false;
enemyBase.anim.SetBool(animBoolName, true);
}
public virtual void Update()
{
stateTimer -= Time.deltaTime;
}
public virtual void Exit()
{
enemyBase.anim.SetBool(animBoolName, false);
}
}
public class SkeletonMoveState : EnemyState
{
Skeleton enemy;
public SkeletonMoveState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Skeleton _enemy)
: base(_enemy, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Eneter()
{
base.Eneter();
}
public override void Update()
{
base.Update();
enemy.SetVelocity(enemy.moveSpeed * enemy.facingDir, enemy.rb.linearVelocityY);
if (enemy.IsWallDetected() || !enemy.IsGroundDetected())
{
enemy.Flip();
stateMachine.ChangeState(enemy.idleState);
}
}
public override void Exit()
{
base.Exit();
}
}