1. 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다. 2. 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다. 3. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 4. 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신을 사용해야 한다. ex) 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
스레드(Thread) 란?
프로세스 내에서 실행되는 여러 흐름의 단위 프로세스의 특정한 수행 경로 프로세스가 할당받은 자원을 이용하는 실행의 단위
스레드의 특징
1. 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다. 2. 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로,
프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다. 3. 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유하는 반면
프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다. 4. 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다. 5. 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
Thread와 Coroutine의 차이
우선 차이점을 말하기 전 공통점은 프로그램을 만드는 과정에서 '비동기' 작업을 하기 위해 사용
비동기는 작업을 수행할때 끝나기전에 다른 작업을 수행하는 것이고,
동기는 작업이 끝날 때까지 기다린 후 다음 작업을 수행하는 것이다.
그런데, 스레드와 코루틴은 근본적으로 큰 차이가 있다.
스레드의 경우 여러 개의 스레드를 사용해서 여러 개의 작업을 '병렬'로 수행하여 비동기적으로 작동한다.
하지만 코루틴의 경우 비동기 작업에 사용되긴 하지만 실제로는 병렬적으로 수행되는 것이 아니고
여러 개의 작업을 잘게 쪼개서 나눠서 작업을 수행하는 방식이다.
코루틴은 실제 병렬 처리 하는 것은 아니지만 스레드보다 가볍기 때문에 성능 면에서 더 좋다고 한다.
애니메이터에 State라는 이름으로 만들어준 Idle과 Run을 각각 0, 1로 지정하였고,
스크립트에서 SetInteger이라는 메소드를 통해 매개변수로 상태와 그 상태번호를 지정
기본 State는 0번인 서있는 상태
키보드 위에 버튼 0번을 누르면 Idle상태
1번을 누르면 Run 상태 호출
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BombGuyController : MonoBehaviour
{
//BombGuyController가 Animator 컴포넌트를 알아야한다
//왜? 애니메이션 전환을 해야 해서
//Animator 컴포넌트는 자식 오브젝트 anim에 붙어 있다
//어떻게 하면 자식오브젝트에 붙어 있는 Animator 컴포넌트를 가져올 수 있을까
[SerializeField] private Animator anim;
private void Start()
{
this.anim.SetInteger("State", 0);
// [SerializeField] Animator anim; 를 쓰지 않는다면
//Transform animTransform = this.transform.Find("anim");
//GameObject animGo = animTransform.gameObject;
//this.anim = animGo.GetComponent<Animator>();
//코루틴 함수 호출시
//this.StartCoroutine(this.CoMove());
}
//IEnumerator CoMove()
//{
// //매 프레임마다 앞으로 이동
// while (true)
// {
// this.transform.Translate(transform.right * 1f * Time.deltaTime);
// yield return null; //다음 프레임으로 넘어간다 => while문 안에 들어가야 함
// }
//}
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha0))
//Alpha+num 은 키보드 위에 숫자버튼
//Keypad+num 은 키보드 우측 숫자버튼
{
Debug.Log("Idle");
//애니메이션 전환 하기
//전환 할 때 파라미터에 값을 변경하기
this.anim.SetInteger("State", 0);
}
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Debug.Log("Run");
this.anim.SetInteger("State", 1);
}
}
}
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Assertions.Comparers;
using UnityEngine.SceneManagement;
public class CatController : MonoBehaviour
{
[SerializeField] private Rigidbody2D rbody;
[SerializeField] private float moveForce = 100f;
[SerializeField] private float jumpForce = 680f;
[SerializeField]
private ClimbCloudGameDirector gameDirector;
private Animator anim;
private bool hasSpace = false;
private void Start()
{
//this.gameObject.GetComponent<Animation>();
anim = GetComponent<Animator>();
//this.gameDirector = GameObject.Find("GameDirector").GetComponent<ClimbCloudGameDirector>();
//this.gameDirector = GameObject.FindAnyObjectByType<ClimbCloudGameDirector>();
}
void Update()
{
//스페이스바를 누르면
if (Mathf.Abs(rbody.velocity.y) < 0.01f)
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (!hasSpace)
{
//힘을 가한다
this.rbody.AddForce(this.transform.up * this.jumpForce);
//this.rbody.AddForce(Vector3.up * this.force);
hasSpace = false; // 다시 점프할 수 있도록 허용
}
}
}
// -1, 0, 1 : 방향
int dirX = 0;
//왼쪽화살표키를 누르고 있는 동안에
if (Input.GetKey(KeyCode.LeftArrow))
{
dirX = -1;
}
if (Input.GetKey(KeyCode.RightArrow))
{
dirX = 1;
}
// Debug.Log(dirX); //방향 -1, 0, 1
//스케일 X를 변경 하는데 키가 눌렸을 때만
//키가 눌렸을때만 = (dirX != 0)
if (dirX != 0)
{
this.transform.localScale = new Vector3(dirX, 1, 1);
}
//벡터의 곱
//Debug.Log(this.transform.right * dirX); //벡터3
//도전 ! : 속도를 제한하자
//velocity.x 가 3정도가 넘어가니깐 빨라지는거 같드라구...
if (Mathf.Abs(this.rbody.velocity.x) < 3)
{
this.rbody.AddForce(this.transform.right * dirX * moveForce);
}
this.anim.speed = (Mathf.Abs(this.rbody.velocity.x) / 2f);
this.gameDirector.UpdateVelocityText(this.rbody.velocity);
// Debug.Log(this.transform.position);
float clampX = Mathf.Clamp(this.transform.position.x, -2.39f, 2.35f);
Vector3 pos = this.transform.position;
pos.x = clampX;
this.transform.position = pos;
}
// Trigger 모드 일경우 충돌 판정을 해주는 이벤트 함수
private bool hasEntered = false;
private void OnTriggerEnter2D(Collider2D collision)
{
if (!hasEntered)
{
Debug.LogFormat("OnTriggerEnter2D: {0}", collision);
SceneManager.LoadScene("ClimbCloudClear");
hasEntered = true; // 한 번 이벤트가 발생하면 이 변수를 true로 설정하여 두 번 이상 호출되지 않도록 함
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEditor.SearchService;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ChangeScene : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0))
{
SceneManager.LoadScene("ClimbCloud");
Debug.Log("화면이 전환됨");
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ClimbCloudGameDirector : MonoBehaviour
{
[SerializeField] private Text velocityText;
public void UpdateVelocityText(Vector2 velocity)
{
float velocityX = Mathf.Abs(velocity.x);
this.velocityText.text = velocityX.ToString();
}
}
콜라이더(Collider)컴포넌트는 물리 충돌 처리를 위한 오브젝트의 형태를 정의합니다. 콜라이더는 보이지 않는 요소이므로 오브젝트의 메시와 정확히 동일한 모양일 필요는 없으며, 실제로는 게임플레이 시에는 대략적인 근사치로도 크게 구분되지 않으며 더 효율적입니다.
가장 간단한(그리고 프로세서에 부하를 주지 않는) 콜라이더는기본콜라이더 타입입니다. 3D에서는박스 콜라이더,스피어 콜라이더,캡슐 콜라이더가 바로 이 타입입니다. 2D에서는박스 콜라이더 2D와써클 콜라이더 2D를 사용할 수 있습니다.복합 콜라이더를 만들기 위해 하나의 오브젝트에 위와 같은 콜라이더를 몇 개든 추가할 수 있습니다.
대리자는 - 메서드에 대한 참조를 나타내는 형식 -> class 모든 메서드가 있는 인스턴스를 호환되는 시그니처 및 반환 형식에 연결 가능 대리자는 메서드를 다른 메서드에 인수(매개변수에 메서드를 인스턴스로 할당) 전달하는데 사용된다 시그니처 -> private 접근제한자 메서드이름 값 메서드 전달하는 것 X
1. 메서드 정의 private int Sum(int a, int b){ return a+b; } ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 2. 메서드를 연결할대리자 형식정의 public delegate int PerformCalculation(int x, int y); 시그니처 반환 타입 int 형 매개변수 2개 (int형, int형) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 3. 대리자 인스턴스 생성 + 4. 대리자에 메서드 연결
// Instantiate the delegate. Callback handler = DelegateMethod;
git add. / git commit -m "" 같은 문구를 보기 편한 UI 버튼으로 만들어주기에
보기에 편하여 사용하는 Tool 이다.
추 후
깃에 올릴때는 본인이 만든 Assets, Packages, ProjectSettings만 복사 한다 나머지 ignore + .vsconfig 깃 레포지 링크를 복사해서 sourcetree에 넣고
새폴더를 만들어 저장위치를 지정하고 클론 생성된 로컬 레포지에 들어가서 새폴더 생성 sourcetree에서 스테이지에 올리면 -> git add. 상태 그리고 메세지를 입력하여 커밋하면 로컬 레퍼지토리로 넘어간다. -> git commit -m " " 그 다음 단계는 푸시 => git push