IT/UNITY(C#)
(C#) Unity유니티_ 바로뒤를 따라다니는 오브젝트 만들기 (지렁이 키우기, 지렁이 꼬리만들기)
KS짱짱맨
2022. 7. 27. 14:58
오늘 구현할 것은
- 플레이어가 어떤 오브젝트에 닿으면 (Trigger 이벤트)
- 그 오브젝트를 플레이어 뒤쪽에 생성
- 플레이어의 이동방향데로 따라 붙은 오브젝트도 따라옴
Scene안에서의 Player 오브젝트 구조와 Components 설정
Player 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public Transform followerTf;
public float diameter;
private List<Transform> followers = new List<Transform>();
private List<Vector2> followerPos = new List<Vector2>();
float h;
float v;
public float speed = 2f;
void Start(){
followerPos.Add(followerTf.position);
}
void Update()
{
v = Input.GetAxisRaw("Vertical"); // 위아래에 해당하는 키보드가 눌릴때 숫자(-1,0,1) 반환
h = Input.GetAxisRaw("Horizontal"); // 왼쪽오른쪽에 해당하는 키보드가 눌릴때 숫자(-1,0,1) 반환
//object의 위치를 눌린 입력받은 값에 따라 이동
transform.position += new Vector3(h, v, 0) * speed * Time.deltaTime;
}
void LastUpdate(){
MakeCivilianFollow();
}
void MakeCivilianFollow(){
float distance = ((Vector2)followerTf.position - followerPos[0]).magnitude; //이전 위치와 현재위치사이의 거리
if (distance > diameter) { 만약 이전 위치와 현재위치 사이의 거리가 , 반지름 보다 커졌을 경우
Vector2 direction = ((Vector2)followerTf.position - followerPos[0]).normalized; // 방향정보
followerPos.Insert(0, followerPos[0] + direction*diameter); //반지름 길이만큼 다음 위치 재조정
followerPos.RemoveAt(followerPos.Count - 1); // 마지막 위치정보 없애기 (뒤쳐짐 방지)
distance -= diameter; // 거리 초기화
}
//follower의 숫자만큼
for (int i=0; i<followers.Count; i++){
// 각각의 follower들이 앞선 위치로 이동 follower[i]의 현재 위치는 followerPos[i+1]임
// 왜냐면 애초에 follower가 한명도 없을 때도 시작 정도를 가지고 있어야 하기 때문
followers[i].position = Vector2.Lerp(followerPos[i+1], followerPos[i], distance/diameter);
}
}
public void AddFollower(){
//맨 마지막 위치에 새로운 follower생성
Transform follower = Instantiate(followerTf, followerPos[followerPos.Count-1], Quaternion.identity, transform);
followers.Add(follower); // follower 추가
followerPos.Add(follower.position); // follower 위치 추가 (맨 마지막 위치)
}
}
Civilain 오브젝트의 Components
Civilian (충돌 당하는 대상) 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Civilian : MonoBehaviour
{
public Player player;
void OnTriggerEnter2D(Collider2D col){
if(col.gameObject.tag == "Player"){
player.AddFollower();
Destroy(gameObject, 0.02f);
}
}
}
끝.
참고사항
(Unity) 물체 생성 : Object.Instantiate (복사할 대상, 위치, 각도, 부모)
(C#) 리스트의 method
https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=net-6.0
List<T> Class (System.Collections.Generic)
Represents a strongly typed list of objects that can be accessed by index. Provides methods to search, sort, and manipulate lists.
docs.microsoft.com
Add(T) | Adds an object to the end of the List<T>. | 리스트 맨뒤에 오브젝트 추가 |
Clear() | Removes all elements from the List<T>. | 리스트에 있는 모든 오브젝트 제거 |
Insert(Index, T) | Inserts an element into the List<T> at the specified index. | 특정 인덱스의 위치로 오브젝트 추가 |
Remove(T) | Removes the first occurrence of a specific object from the List<T>. | 가장 처음 나타나는 type 오브젝트제거 |
RemoveAll(T) | Removes all the elements that match the conditions defined by the specified predicate. | 모든 일치하는 type 오브젝트 제거 |
RemoveAt(Index) | Removes the element at the specified index of the List<T>. | 특정 인덱스에 있는 오브젝트제거 |
728x90