티스토리 뷰
오늘 구현할 것은
- 플레이어가 어떤 오브젝트에 닿으면 (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
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
'IT > UNITY(C#)' 카테고리의 다른 글
(C#) 비전공자도 이해하는 추상(abstract )의 개념 (0) | 2022.07.29 |
---|---|
(C#) Unity_ Coroutine을 활용한 랜덤 움직임 구현 (0) | 2022.07.29 |
(C#) Unity_플레이어를 따라오는 카메라 구현 (2D) (0) | 2022.07.26 |
Unity_멀티플레이 구현에 앞서 알아야할 것들 (0) | 2022.07.19 |
(C#) UNITY_다른 스크립트에 존재하는 변수, 함수(메서드) 접근하기 (0) | 2022.07.18 |
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- requests
- 가격데이터
- 프로그래머스
- It
- 주식투자
- IT기초
- 심리학
- Unity
- Anet
- 시스템투자
- 랜덤맵
- beautifulsoup
- 강화학습
- 주식
- 터틀트레이딩
- 파이썬
- 마케팅
- 비전공자
- C#
- json
- 사진크롤링
- 알고리즘
- 유니티
- 일자별
- 크롤링
- 스타트업
- ET5X
- PYTHON
- 경영학
- 머신러닝
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함