일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 크래프톤 정글
- 오블완
- 크래프톤정글
- 알고리즘수업-너비우선탐색2
- anonymous page
- User Stack
- KRAFTON JUNGLE
- BFS
- 핀토스
- 이벤트 함수 실행 순서
- 전쟁-전투
- 다익스트라
- project3
- 알고리즘
- c#
- 티스토리챌린지
- C
- 4기
- 크래프톤정글4기
- 연결리스트
- 백준
- Unity
- 네트워크
- 추상클래스와인터페이스
- 파이썬
- pintos
- kraftonjungle
- TiL
- 크래프톤 정글 4기
- 유니티
Archives
- Today
- Total
말감로그
[Unity] Valley - 동물 움직임 제어 본문
728x90
그래도 농장인데 플레이어와 나무만 있으면 심심할 것 같아 소를 하나 만들어서 울타리 안에서 자유자재로 이동시키는 작업을 하였다.
우선 소의 idle, walk 애니메이션을 만든 후, 스크립트를 생성하여 소의 랜덤 이동 방식을 구현하였다.
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.Callbacks;
using UnityEngine;
using UnityEngine.UIElements;
public class Cow : MonoBehaviour
{
public float walkSpeed = 1.2f;
public float walkTime = 3f;
public float idleTime = 2f;
private Rigidbody2D rigid;
private Animator anim;
private SpriteRenderer sprite;
private Vector2 direction;
private float timer;
private bool isWalking;
void Start()
{
anim = GetComponent<Animator>();
rigid = GetComponent<Rigidbody2D>();
sprite = GetComponent<SpriteRenderer>();
timer = walkTime;
isWalking = true;
ChooseRandomDirection();
}
void Update()
{
Debug.DrawRay(rigid.position, direction, Color.red);
timer -= Time.deltaTime;
if (isWalking)
{
RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, direction, 1f, LayerMask.GetMask("Fence"));
if (rayHit.collider != null)
{
rigid.velocity = Vector2.zero;
anim.SetBool("isWalking", false);
StopWalking();
Invoke("ChooseRandomDirection", 2f);
}
else
{
rigid.velocity = direction * walkSpeed;
anim.SetBool("isWalking", true);
if (timer <= 0)
{
StopWalking();
}
}
}
else
{
rigid.velocity = Vector2.zero;
anim.SetBool("isWalking", false);
if (timer <= 0)
{
StartWalking();
}
}
}
void StartWalking()
{
isWalking = true;
timer = walkTime;
ChooseRandomDirection();
}
void StopWalking()
{
isWalking = false;
timer = idleTime;
}
void ChooseRandomDirection()
{
direction = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f)).normalized;
if (direction.x < 0)
{
sprite.flipX = true;
}
else
{
sprite.flipX = false;
}
}
}
Raycast를 통해 울타리를 인식하면 이동을 멈추고, 랜덤한 방향으로 다시 이동시키게끔 하였다. 그리고 그 방향에 맞게 sprite를 전환해주었다.
각 레이케스트를 통해 울타리를 인식하고, 멈추는 모습을 볼 수 있다!
728x90
'TIL' 카테고리의 다른 글
[Unity] Valley - Item Shop 구현 (0) | 2024.11.21 |
---|---|
[Unity] Valley - 씬 이동 시 페이드 인/아웃 효과 & 텍스트 효과 & 플레이어 돈 시간 저장(PlayerPrefs) (1) | 2024.11.20 |
[Unity] Valley - Animated Tile (0) | 2024.11.15 |
[Unity] Valley - 식물 로드 버그 수정 (0) | 2024.11.14 |
[Unity] Valley - 식물 데이터 저장/로드 (새로하기 & 이어하기) (0) | 2024.11.13 |