728x90

1.자료구조(Data Structure)

  • 문제 해결이 쉽도록, 손쉬운 접근, 변경, 처리가 가능하게, 데이터를 조직화, 저장, 표현하는 방법
    • 구조화된 데이터에 특정한 연산들을 용이하게 할 수 있는 구조
  • 알고리즘 적용시, 효과적으로 처리 가능하도록 만들어진 특화된 데이터 체제/형태
    • ex) 배열, 링크드 리스트, 스택, 큐, 트리, 그래프 등
  • 자료 및 그 처리를 합계 고려하는 데이터 형식
    • 즉, 자료와 그 작동을 합계 고려하면서
      • 이를 컴퓨터에 효과적으로 표현, 저장, 처리하는 기술
    • 특히, 이 둘을 잘 감싸는(캡슐화) 것을, 추상자료형이라고 한다.

2.자료구조의 목적/이유

  • (추상화) 현실 세계에 존재하는 개념, 구조의 표현
    • 약속된 자료구조를 쓰면 좀 더 높은 단계의 프로그래밍이 가능
  • (효율성) 효율적으로 데이터를 사용하기 위함
    • 통상, 좋은 자료구조는 연산의 횟수를 작아지게 할 수 있지만,
      • 모든 목적에 적합한 단일한 자료구조는 없으며, 응용에 따라 달라진다.
    • 또한, 사칙연산 이외에도,
      • 읽기, 삽입, 삭제, 비교, 교환, 검색 등의 용이성, 효율성도 고려 필요
  • 즉, 문제 마다 적절한 자료구조를 사용함으로써,
    • 사용 편의성, 메모리 효율성, 코드 성능, 버그 감소 등 측면에서 유리하다.

3.자료구조의 종류

  • 단순 구조 (통상, 자료구조로써 구분 포함시키지 않음)
    • 문자형, 문자열형, 숫자형, 논리형 등
  • 자료 간의 연결 형태/모양에 따른 구분
    • 선형 자료구조 (linear, 전후 1:1 연결 형태)
      • 기본 선형 자료구조 : 리스트, 연결 리스트, 배열, 레코드 등
        • 특히 배열, 리스트 이 둘로부터, 대부분의 다른 자료구조들을 구현 가능
      • 제한 선형 자료구조 : 스택, 큐, 데크(스택과 큐가 혼합된 형태) 등
        • 자료의 입출력이 정해진 위치에서 만 가능
    • 비선형 자료구조(nonlinear, 전후 다대다 연결 형태)
      • 트리, 그래프 등
  • 자료 간에 연속, 연결 구조에 따른 구분
    • 배열에 기반한 연속 방식 구조(continuation) : 리스트 등
    • 포인터 기반의 연결 방식 구조(link) : 연결 리스트 등
  • 기타 자료구조 구분
    • 입출력 순서를 중심으로 성립되는 자료구조 : 스택, 큐 등
    • 자료들 간에 입출력 순서가 중요하지 않은 자료구조 : 집합, 딕셔너리/사전 등
    • 키 값의 연산에 의해 직접 접근이 가능한 자료구조 : 해시 테이블
    • 파일 구조에 따른 구분 : 순차 파일, 색인 파일, 직접 파일

4.자료구조의 선택 (고려 사항)

  • 데이터의 양
  • 데이터 사용 횟수 및 방법
  • 요구되는 기억장치의 양
  • 데이터 수정에 필요한 시간
  • 알고리즘 복잡도 등

5.자료구조의 관점 (저장, 처리)

  • 데이터의 저장/접근 관점
    • 데이터를 컴퓨터 메모리에 저장/접근할 때,
    • 데이터의 순서 및 위치관계 등이 명확하게 정해져야 올바른 처리 가능 하다.
  • 데이터 및 연산을 다루는 관점
    • 자료형(Data Type) : 데이터 중심으로 만 고려
      • 자료(변수)가 갖는 값의 종류를 표현
      • 이때, 연산은 그 자료형에 맞도록, 별도/부가적/부차적으로 수행되는 관점이다.
    • 추상 자료형(Abstract Data Type) : 데이터와 연산을 함께 고려
      • "자료" 및 "연산"을 모두 하나로 묶어 하나의 단위로 표현
      • 자료 저장 및 처리보다는 문제 해결 지향적인 자료형이다.
  • 예) 자료구조별 대표적인 연산들
    • 스택 : push(), pop(), createStack() 등
    • 큐 : inqueue(), dequeue(), createQueue() 등

6.자료구조의 표현 (구현)

  • 사전 정의형 (프로그래밍 언어에서 기본 내장 제공)
    • C언어 (배열, 구조체 등)
    • 파이썬 (리스트, 튜플, 집합 등)
  • 사용자 정의형 (프로그래머가 응요에 따라 직접 구현)
    • 다루는 데이터들에 대해,
      • 단순히 적절한 자료형을 선택하는 것 이상으로,
    • 종합적으로 고려하면서,
      • 어떤 연산들이 필요하고,
      • 데이터를 효율적으로 저장하는 방법은 어떻고,
      • 유효한 연산들은 무엇인지 등
    • 자료구조 및 알고리즘 등을 설계 구현해야 한다.

 

 

참고 : ktword.co.kr

728x90

'전산 > 자료구조' 카테고리의 다른 글

자료구조 - 스택(Stack)  (0) 2024.07.01
자료구조 - 01 자료구조와 알고리즘  (0) 2024.04.29
728x90

터미널으로 GitHub을 이용해 보자

// Git 설치 확인 (버전 확인)
git --version

// 로컬 저장소 초기화
cd ~/로컬 저장소
git init 

// .gitignore 파일 생성
// Unity 프로젝트에는 Library, Temp, Obj, Logs 폴더 등을 Git에서 제외하는 것이 좋다. 이를 위해 .gitignore 파일을 생성한다.
echo "/[Ll]ibrary/" >> .gitignore
echo "/[Tt]emp/" >> .gitignore
echo "/[Oo]bj/" >> .gitignore
echo "/[Ll]ogs/" >> .gitignore
echo "/[Uu]ser[Ss]ettings/" >> .gitignore
echo "/[Bb]uild/" >> .gitignore
echo "/[Bb]uilds/" >> .gitignore
echo "/[Aa]ssets/[Aa]ddresses/" >> .gitignore

// 파일 추가 및 커밋
git add .
git commit -m "커밋 메세지"


// 파일 업로드 
git push -u origin main

// 저장소 복제
git clone <repository_url>

// 변경된 내용을 확인
git diff

// 파일 추가
git add <file_or_directory>

브랜치 관리 예시

// 로컬 브랜치 목록 확인
git branch

// 원격 브랜치 목록 확인
git branch -r

// 모든 브랜치 목록 확인
git branch -a

// 현재 브랜치 확인
git status

// 새로운 브랜치 생성
git branch new-feature

// 브랜치 전환
git checkout new-feature

// 새로운 브랜치 생성 및 전환
git checkout -b another-feature

// 로컬 브랜치 삭제
git branch -d old-feature

// 원격 브랜치 삭제
git push origin --delete old-feature    

원격 저장소 관련

// 원격 저장소 추가
git remote add origin 깃허브 주소

// 원격 저장소 목록 확인
git remote -v

// 푸쉬
git push origin <branch_name>

// 풀
git pull origin <branch_name>

// 강제 푸시
git push origin <branch_name> --force

// 병합 (다른 브랜치의 변경 사항을 현재 브랜치에 병합)
git merge <branch_name>

// 리베이스 
git rebase <branch_name>

태그 관련

// 태그 생성
git tag <tag_name>

// 태그 푸쉬
git push origin <tag_name>

기타

// 로그 확인
git log

// 파일 삭제
git rm <file>
728x90

'전산 > Git' 카테고리의 다른 글

Git - 01 깃 시작하기  (1) 2024.05.15
728x90

Invoke

Invoke 함수를 사용하면 메서드가 나중에 호출되도록 예약할 수 있습니다. 이 영상에서는 Unity 스크립트에서 Invoke, InvokeRepeating, CancelInvoke 등의 함수를 사용하는 방법을 알아봅니다.

InvokeScript

using UnityEngine;
using System.Collections;

public class InvokeScript : MonoBehaviour
{
    public GamaObject target;

    private void State()
    {
        Inboke(nameof(SpawnObject),2);
    }

    private SpawnObject()
    {
        Instantiate(target, new Vector3(0,2,0),Quaternion.identity);
    }
}

InvokeRepeating

using UnityEngine;
using System.Collections;

public class InvokeRepeating : MonoBehaviour 
{
    public GameObject target;


    void Start()
    {
        InvokeRepeating("SpawnObject", 2, 1);
    }

    void SpawnObject()
    {
        float x = Random.Range(-2.0f, 2.0f);
        float z = Random.Range(-2.0f, 2.0f);
        Instantiate(target, new Vector3(x, 2, z), Quaternion.identity);
    }
}

참고 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - 인스턴스화  (0) 2024.07.02
Unity - Class  (0) 2024.07.02
Unity - 데이터 유형  (0) 2024.07.02
Unity - GetComponent  (0) 2024.07.02
Unity - OnMouseDown  (0) 2024.07.02
728x90

인스턴스화

Instantiate 함수를 사용하여 런타임 시 프리팹의 클론을 생성하는 방법을 알아봅니다.

UsingInstantiate

using UnityEngine;
using System.Collections;

public class UsingInstantiate : MonoBehaviour
{
    public Rigidbody rocketPrefab;
    public Transform barrelEnd;


    void Update ()
    {
        if(Input.GetButtonDown("Fire1"))
        {
            Rigidbody rocketInstance;
            rocketInstance = Instantiate(rocketPrefab, barrelEnd.position, barrelEnd.rotation) as Rigidbody;
            rocketInstance.AddForce(barrelEnd.forward * 5000);
        }
    }
}

&nbsp

RocketDestruction

```
using UnityEngine;
using System.Collections;

public class RocketDestruction : MonoBehaviour
{
void Start()
{
Destroy (gameObject, 1.5f);
}
}
``

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - Invoke  (0) 2024.07.02
Unity - Class  (0) 2024.07.02
Unity - 데이터 유형  (0) 2024.07.02
Unity - GetComponent  (0) 2024.07.02
Unity - OnMouseDown  (0) 2024.07.02
728x90

Class

클래스를 사용하여 정보를 저장하고 구성하는 방법과, 클래스의 일부와 함께 작동하는 생성자를 생성하는 방법을 알아봅니다.

SingleCharacterScript

using UnityEngine;
using System.Collections;

public class SingleCharacterScript : MonoBehaviour
{
    public class Stuff
    {
        public int bullets;
        public int grenades;
        public int rockets;

        public Stuff(int bul, int gre, int roc)
        {
            bullets = bul;
            grenades = gre;
            rockets = roc;
        }
    }


    public Stuff myStuff = new Stuff(10, 7, 25);
    public float speed;
    public float turnSpeed;
    public Rigidbody bulletPrefab;
    public Transform firePosition;
    public float bulletSpeed;


    void Update ()
    {
        Movement();
        Shoot();
    }


    void Movement ()
    {
        float forwardMovement = Input.GetAxis("Vertical") * speed * Time.deltaTime;
        float turnMovement = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;

        transform.Translate(Vector3.forward * forwardMovement);
        transform.Rotate(Vector3.up * turnMovement);
    }


    void Shoot ()
    {
        if(Input.GetButtonDown("Fire1") && myStuff.bullets > 0)
        {
            Rigidbody bulletInstance = Instantiate(bulletPrefab, firePosition.position, firePosition.rotation) as Rigidbody;
            bulletInstance.AddForce(firePosition.forward * bulletSpeed);
            myStuff.bullets--;
        }
    }
}

Inventory

sing UnityEngine;
using System.Collections;

public class Inventory : MonoBehaviour
{
    public class Stuff
    {
        public int bullets;
        public int grenades;
        public int rockets;
        public float fuel;

        public Stuff(int bul, int gre, int roc)
        {
            bullets = bul;
            grenades = gre;
            rockets = roc;
        }

        public Stuff(int bul, float fu)
        {
            bullets = bul;
            fuel = fu;
        }

        // 생성자
        public Stuff ()
        {
            bullets = 1;
            grenades = 1;
            rockets = 1;
        }
    }


    // Stuff 클래스의 인스턴스(오브젝트) 생성
    public Stuff myStuff = new Stuff(50, 5, 5);

    public Stuff myOtherStuff = new Stuff(50, 1.5f);

    void Start()
    {
        Debug.Log(myStuff.bullets); 
    }
}

MovementControls

using UnityEngine;
using System.Collections;

public class MovementControls : MonoBehaviour
{
    public float speed;
    public float turnSpeed;


    void Update ()
    {
        Movement();
    }


    void Movement ()
    {
        float forwardMovement = Input.GetAxis("Vertical") * speed * Time.deltaTime;
        float turnMovement = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;

        transform.Translate(Vector3.forward * forwardMovement);
        transform.Rotate(Vector3.up * turnMovement);
    }
}

Shooting

using UnityEngine;
using System.Collections;

public class Shooting : MonoBehaviour
{
    public Rigidbody bulletPrefab;
    public Transform firePosition;
    public float bulletSpeed;


    private Inventory inventory;


    void Awake ()
    {
        inventory = GetComponent<Inventory>();
    }


    void Update ()
    {
        Shoot();
    }


    void Shoot ()
    {
        if(Input.GetButtonDown("Fire1") && inventory.myStuff.bullets > 0)
        {
            Rigidbody bulletInstance = Instantiate(bulletPrefab, firePosition.position, firePosition.rotation) as Rigidbody;
            bulletInstance.AddForce(firePosition.forward * bulletSpeed);
            inventory.myStuff.bullets--;
        }
    }
}

참고 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - Invoke  (0) 2024.07.02
Unity - 인스턴스화  (0) 2024.07.02
Unity - 데이터 유형  (0) 2024.07.02
Unity - GetComponent  (0) 2024.07.02
Unity - OnMouseDown  (0) 2024.07.02
728x90

데이터 유형

변수의 작동 방식을 정확히 이해할 수 있도록 값과 레퍼런스 데이터 유형의 주요 차이점에 대해 알아볼까요?

Value

  • int
  • float
  • double
  • bool
  • char
  • Structs
    • Vector3
    • Quaternion

 

 

Reference

  • Classes
    • Transform
    • GameObject

 

 

DatatypeScript

using UnityEngine;
using System.Collections;

public class DatatypeScript : MonoBehaviour 
{
    void Start () 
    {
        //값 유형 변수
        Vector3 pos = transform.position;
        pos = new Vector3(0, 2, 0);

        //레퍼런스 유형 변수
        Transform tran = transform;
        tran.position = new Vector3(0, 2, 0);
    }
}

참고 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - 인스턴스화  (0) 2024.07.02
Unity - Class  (0) 2024.07.02
Unity - GetComponent  (0) 2024.07.02
Unity - OnMouseDown  (0) 2024.07.02
Unity - GetAxis  (0) 2024.07.02
728x90

GetComponent

GetComponent 함수를 사용하여 다른 스크립트 또는 컴포넌트의 프로퍼티를 지정하는 방법을 알아봅니다.

가급적이면 Awake(), Start()에 한번만 호출하는 것이 좋다.

UsingOtherComponents

using UnityEngine;
using System.Collections;

public class UsingOtherComponents : MonoBehaviour
{
    public GameObject otherGameObject;


    private AnotherScript anotherScript;
    private YetAnotherScript yetAnotherScript;
    private BoxCollider boxCol;


    void Awake ()
    {
        anotherScript = GetComponent<AnotherScript>();
        yetAnotherScript = otherGameObject.GetComponent<YetAnotherScript>();
        boxCol = otherGameObject.GetComponent<BoxCollider>();
    }


    void Start ()
    {
        boxCol.size = new Vector3(3,3,3);
        Debug.Log("The player's score is " + anotherScript.playerScore);
        Debug.Log("The player has died " + yetAnotherScript.numberOfPlayerDeaths + " times");
    }
}

AnotherScript

using UnityEngine;
using System.Collections;

public class AnotherScript : MonoBehaviour
{
    public int playerScore = 9001;
}

YetAnotherScript

using UnityEngine;
using System.Collections;

public class YetAnotherScript : MonoBehaviour
{
    public int numberOfPlayerDeaths = 3;
}

참고 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - Class  (0) 2024.07.02
Unity - 데이터 유형  (0) 2024.07.02
Unity - OnMouseDown  (0) 2024.07.02
Unity - GetAxis  (0) 2024.07.02
Unity - 선형 보간  (0) 2024.07.02
728x90

OnMouseDown

콜라이더 또는 GUI 요소에 대한 마우스 클릭을 감지하는 방법을 알아봅니다.

MouseClick

using UnityEngine;
using System.Collections;

public class MouseClick : MonoBehaviour
{

    private Rigidbody rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void OnMouseDown ()
    {
        rb.AddForce(-transform.forward * 500f);
        rb.useGravity = true;
    }
}

출처 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - 데이터 유형  (0) 2024.07.02
Unity - GetComponent  (0) 2024.07.02
Unity - GetAxis  (0) 2024.07.02
Unity - 선형 보간  (0) 2024.07.02
Unity - Coroutine  (0) 2024.07.01
728x90

GetAxis

Unity에서 게임 입력에 기반하여 축을 가져오는 방법을 살펴보고, 이러한 축을 Unity 입력 관리자를 통해 어떻게 수정할 수 있는지 알아보겠다.

AxisExample

using UnityEngine;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class AxisExample : MonoBehaviour
{
    public float range;
    public Text textOutput;


    void Update () 
    {
        float h = Input.GetAxis("Horizontal");
        float xPos = h * range;

        transform.position = new Vector3(xPos, 2f, 0);
        textOutput.text = "Value Returned: " + h.ToString("F2");  
    }
}

AxisRawExample

using UnityEngine;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class AxisRawExample : MonoBehaviour
{
    public float range;
    public Text textOutput;


    void Update () 
    {
        float h = Input.GetAxisRaw("Horizontal");
        float xPos = h * range;

        transform.position = new Vector3(xPos, 2f, 0);
        textOutput.text = "Value Returned: " + h.ToString("F2");  
    }
}

DualAxisExample

using UnityEngine;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class DualAxisExample : MonoBehaviour 
{
    public Text horizontalValueDisplayText;
    public Text verticalValueDisplayText;
    public float hRange;
    public float vRange;

    void Update ()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float xPos = h * hRange;
        float yPos = v * vRange;

        transform.position = new Vector3(xPos, 0, vPos);
        horizontalValueDisplayText.text = h.ToString("F2");
        verticalValueDisplayText.text = v.ToString("F2");
    }
}

 

 

참고 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - GetComponent  (0) 2024.07.02
Unity - OnMouseDown  (0) 2024.07.02
Unity - 선형 보간  (0) 2024.07.02
Unity - Coroutine  (0) 2024.07.01
유니티 게임 프로그래밍 패턴 - SOLID 원칙  (0) 2024.06.19
728x90

게임 제작 시 두 값을 선형적으로 보간하면 유용한 경우가 있다.
선형 보간은 Lerp라는 함수를 통해 이루어진다.

선형 보간은 주어진 두 값 사이의 일정 비율에 해당하는 값을 찾는 것
예를 들어 숫자 3과 5를 50%로 선형적으로 보간한 결과는 숫자 4이다.
4는 3과 5 사이의 50% 지점에 있기 때문

Unity에는 다양한 유형에 사용 가능한 여러 Lerp 함수가 있다.

// 이경우, 결과 = 4
float result = Mathf.Lerf(3f,5f,0.5f);

 

Mathf.Lerp 함수는 3개의 float 파라미터를 사용

  • 하나는 보간 시작값
  • 다른 하나는 보간 끝 값
  • 마지막 float는 보간 거리를 나타낸다.
    이 경우 보간 값은 0.5로 50%를 의미
    값이 0이면 이 함수는 '시작'값을 반환하고, 값이 1이면 '끝' 값을 반환

 

Lerp함수의 다른 예로는 Color.Lerp와 Vector3.Lerp가 있다.
이 함수는 Mathf.Lerp와 완전히 동일하게 작동하지만 시작 및 끝 값이 Color 유형과 Vector3 유형이다.
각각의 경우에 세 번째 파라미터는 그대로 보간되는 양을 나타내는 float이다.
이 두 함수의 결과는 각각 특정 색상 2개를 블렌딩한 색상, 특정 벡터 2개 사이의 일정 비율에 해당하는 벡터가 되겠다.

Vector3 from = new Vector3 (1f,2f,3f);
Vector3 to = new Vector3 (5f,6f,7f);

// 이 경우 결과 = (4,5,6)
Vector3 result = Vector3.Lerp(from,to,0.75f);

이 경우 결과는 (4,5,6)이다.
4는 1과 5사이의 75% 지점에 있고, 5는 2와 6사이의 75% 지점에 있으며, 6은 3과 7의 75% 지점에 있기 때문

Color.Lerp를 사용하는 경우에도 동일한 원이 적용된다.
Color 구성에서 색상은 빨간색, 파란색, 초록색, 알파를 나타내는 4개의 float로 표현
Lerp 사용 시 이러한 float는 Mathf.Lerp 및 Vector3.Lerp와 마찬가지로 보간

상황에 따라 시간이 지나며 값을 매끄럽게 전환하는 데 Lerp 함수를 사용할 수 있음.

 

 

void Update()
{
    light.intensity = Mathf.Lerp(light.intensity,8f,0.5f);
}

0에서 시작하는 광원 강도는 첫 Update 호출 후 4로 설정되며 그 다음 프레임은 6,7,7.5 등으로 설정
따라서 여러 프레임을 거치면서 광원 강도는 8로 향하게 되지만 변경 속도는 목표에 다가갈수록 느려진다.
강도는 여러 프레임을 거치면서 변한다.
프레임 속도에 구애받지 않으려면 다음 코드를 사용하면 된다.

 

 

void Update()
{
     light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime);
}

 

그러면 강도는 프레임이 아닌 초를 기준으로 변경된다.

값을 매끄럽게 전화하려는 경우 SmoothDamp 함수를 사용하는 것이 가장 좋을 수 있음.
매끄러운 전환 효과를 원하는 대로 구현할 수 있는 경우에만 Lerp를 사용하자.



참고 문헌 : 유니티 튜토리얼

728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - OnMouseDown  (0) 2024.07.02
Unity - GetAxis  (0) 2024.07.02
Unity - Coroutine  (0) 2024.07.01
유니티 게임 프로그래밍 패턴 - SOLID 원칙  (0) 2024.06.19
유니티 - InspectorAttribute  (0) 2024.05.03

+ Recent posts