> 예제

using UnityEngine;
using UnityEngine.SceneManagement;

public class ExampleCode : MonoBehaviour
{
    void Start()
    {
    	  DonDestroyOnLoad();
        // Start는 최초 씬에서만 호출된다.
    }

    void OnEnable()
    {
    	  // 씬 매니저의 sceneLoaded에 체인을 건다.
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    // 체인을 걸어서 이 함수는 매 씬마다 호출된다.
    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        Debug.Log("OnSceneLoaded: " + scene.name);
        Debug.Log(mode);
    }

    void OnDisable()
    {
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }
}

 

> 로비 씬에서 인게임 씬에 데이터 넘겨주기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;

public class Lobby : MonoBehaviour
{
    public Button btn1;
    public Button btn2;
    public int id;


    // Start is called before the first frame update
    void Start()
    {
        this.btn1.onClick.AddListener(() =>
        {
            log("1");
            SceneManager.sceneLoaded += SceneLoad; // 씬 로드 될 때 실행
            SceneManager.LoadScene("Ingame");
        });

        this.btn2.onClick.AddListener(() =>
        {
            log("2");
            SceneManager.sceneLoaded += SceneLoad;
            SceneManager.LoadScene("Ingame");
        });
    }

    private void SceneLoad(Scene scene, LoadSceneMode mode)
    {

        log("[Lobby] 델리게이트");
        this.id = 100;
        GameObject inGameGo = GameObject.Find("Ingame");
        var ingame = inGameGo.GetComponent<Ingame>();
        ingame.Init(this.id);
    }

    // Update is called once per frame
    void Update()
    {
    }

    public static void log(object data) { Debug.Log(data); }
}

'c# 강의 > 유니티' 카테고리의 다른 글

▶ 유니티/싱글톤 - DataManager  (0) 2020.05.12
▶ 마우스 이벤트  (0) 2020.05.11
20200511 - 현재까지 패키지 구성  (0) 2020.05.11
20200511 - Scene  (0) 2020.05.11
20200511 - FindWithTag (자주 쓰이는 예제 필요)  (0) 2020.05.11

> 정리

> 클래스
- : MonoBehaviour 삭제

> 생성자 
- private DataManager()  디셔너리 초기화

> 멤버
- private static DataManager instance;
- priavte Dictionary<int, data타입> dic타입datas;

> 인스턴스 메소드
- public static DataManager GetInstance(){
    if(DataManager.instance == null) DataManager.instance = new DataManager();
    return DataManager.instance;
}

> JSON Data 파일 직렬화
- LoadDatas();
- Resources.Load("Data/chacacter_data") <-- Object 타입 리턴
- Json파일은 TextAsset타입으로 받을수 있다.
- TextAsset textAsset = Resources.Load("Data/character_data") as TextAsset;
- string json = textAsset.text;
- data.cs 만들어논 타입[]로 직렬화 
- 디셔너리 =  타입[].ToDictionary( x => x.id);

> data 값 리턴해주는 메소드들 작성

 

> code 참고

더보기
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Newtonsoft.Json;

public class DataManager
{
    private static DataManager instance;
    private Dictionary<int, CharacterData> dicCharacterDatas;


    private DataManager()
    {
        this.dicCharacterDatas = new Dictionary<int, CharacterData>();
    }

    public DataManager GetInstance()
    {
        if (DataManager.instance == null)
        {
            DataManager.instance = new DataManager();
        }
        return DataManager.instance;
    }

    public void LoadData()
    {
        TextAsset textAsset = Resources.Load("data/character_data") as TextAsset;
        string json = textAsset.text;
        Debug.Log(json);

        CharacterData[] arrCharacterData = JsonConvert.DeserializeObject<CharacterData[]>(json);

        this.dicCharacterDatas = arrCharacterData.ToDictionary(x => x.id);

    }

    public CharacterData GetCharacterDataById(int id)
    {
        return this.dicCharacterDatas[id];
    }


}

'c# 강의 > 유니티' 카테고리의 다른 글

20200512 - 델리게이트 / 대리자  (0) 2020.05.12
▶ 마우스 이벤트  (0) 2020.05.11
20200511 - 현재까지 패키지 구성  (0) 2020.05.11
20200511 - Scene  (0) 2020.05.11
20200511 - FindWithTag (자주 쓰이는 예제 필요)  (0) 2020.05.11
public class ExampleClass : MonoBehaviour {
    void Update() { 
        //  0, 1, 2에 따라 마우스 [왼쪽버튼], [오른쪽버튼], [휠버튼]

        if (Input.GetMouseButton (0))
            Debug.Log("마우스 버튼을 누르는 동안");
        
        if (Input.GetMouseButtonDown (1))
            Debug.Log("마우스 버튼을 누른 순간");
        
        if (Input.GetMousebuttonUp (2))
            Debug.Log("마우스 버튼을 눌렀다 때는 순간.");
     // Input.mousePositio  마우스 클릭한 좌표값 얻을수 있음
    }
}
Assets
ㄴ ArtResources
ㄴ Resources
    ㄴ Data
    ㄴ Prefabs
ㄴ Scenes
ㄴ Scripts
    ㄴ Data
ㄴ Textures

 

'c# 강의 > 유니티' 카테고리의 다른 글

▶ 유니티/싱글톤 - DataManager  (0) 2020.05.12
▶ 마우스 이벤트  (0) 2020.05.11
20200511 - Scene  (0) 2020.05.11
20200511 - FindWithTag (자주 쓰이는 예제 필요)  (0) 2020.05.11
20200508 - 프리팹  (0) 2020.05.08

 

> 정리


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Newtonsoft.Json;

public class App : MonoBehaviour
{
    float timer;
    int logoWaitingTime;
    int titleWaitingTime;

    private void Awake()
    {
          UnityEngine.Object.DontDestroyOnLoad(this);
    }

    void Start()
    {
        this.timer = 0.0f; // 타이머
        this.logoWaitingTime = 1; // 로고 시간
        this.titleWaitingTime = 1; // 타이틀 시간
    }

    // Update is called once per frame
    void Update()
    {
        this.timer += Time.deltaTime;

        if (this.timer > logoWaitingTime){
            SceneManager.LoadScene("Logo");
        }

        if (this.timer > titleWaitingTime){
            SceneManager.LoadScene("Title");
            this.timer = 0.0f;
        }
    }
}

 

 

> 씬 적용 순서

 

 

 


강의중 기록

 

 

 

App - 로고 - 타이틀 - 로딩화면 - 로비 - 인게임

App: 진입씬

여러가지 씬들은 전환될수 있다

 

  • 씬 (로고, 타이틀)
  • 팝업: 닫기 버튼이 무조건 있음
  • 페이지: 뒤로가기가 무조건 있음

// 팝업과 페이지는 씬으로 보지 않음


 

 

 

 

 

 

 


 

 

 

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class App : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // logo 씬으로 전환
        SceneManager.LoadScene("logo");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    void log(object data)
    {
        Debug.Log(data);
    }
}

 

> app -> logo -> title 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class App : MonoBehaviour
{
    // Start is called before the first frame update

    private void Awake()
    {
        UnityEngine.Object.DontDestroyOnLoad(this);
    }

    void Start()
    {
        // logo 씬으로 전환
        SceneManager.LoadScene("logo");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    void log(object data)
    {
        Debug.Log(data);
    }
}

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Title : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            this.log("down click");

            SceneManager.LoadScene("Lobby");
        }

        if (Input.GetMouseButtonUp(0))
        {
            this.log("up click");
            SceneManager.LoadScene("Lobby");

        }
    }

    void log(object data)
    {
        Debug.Log(data);
    }
}

 

 

    private void Awake()
    {
       var mainCamGo = GameObject.FindWithTag("Player");

        Debug.Log(mainCamGo.name);
    }

'c# 강의 > 유니티' 카테고리의 다른 글

20200511 - 현재까지 패키지 구성  (0) 2020.05.11
20200511 - Scene  (0) 2020.05.11
20200508 - 프리팹  (0) 2020.05.08
20200507 - 캐릭터 생성 및 무기 장착  (0) 2020.05.08
20200508 - 벡터1  (0) 2020.05.08

> GameObject 가 파일화 된 것

 

 

 

클론 프리팹 연결 해제

 

폴더 이름 대소문자 까지 같아야함 위치는 상관없음

 

Prefabs 폴더 생성

 

 


> 리소스 불러오기

public GameObject heroPrefab;

void Start(){
this.heroPrefab =  Resources.Load("Prefabs/ch_01_01") as GameObject;
        Debug.Log(this.heroPrefab);
        
        }

 

 

 


 

 

1. prefab을 로드 한다(Hero, ch_01_01 )

-> Resources.Load(경로) 확장자 제외 Assets/Resources 까지 상위 폴더 경로 필요

    Resources.Load(경로) as GameObject;

-> Resources.Load<GameObject>(path) 가능하다.

 

2. Hero 프리팹을 Instantiate 한다 -> Hero 프리팹의 Clone게임오브젝트 생성됨.

 

3. Hero컴포넌트를 부착

  ->  this.heroPrefab.AddComponent<Hero>();

 

4. Model(ch_01_01) 프리팹을 Instantiate 한다

-> ch_01_01 프리팹의 Clone 게임오브젝트 생성됨

 

5. ch_01_01게임 오브젝트(Clone)의 부모로 Hero 게임 오브젝트 (Clone) 를 설정

 this.transform.SetParent(paransfrom);

this.transform.SetParent(paransfrom, false);

 

'c# 강의 > 유니티' 카테고리의 다른 글

20200511 - Scene  (0) 2020.05.11
20200511 - FindWithTag (자주 쓰이는 예제 필요)  (0) 2020.05.11
20200507 - 캐릭터 생성 및 무기 장착  (0) 2020.05.08
20200508 - 벡터1  (0) 2020.05.08
20200508 - 복습  (0) 2020.05.08

 

 

 

 


 

> Code

더보기

> App.cs

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


public class App : MonoBehaviour
{
    public Button btn;
    public GameObject heroPrefab;
    public GameObject weaponPrefab;

    private void Start()
    {
        this.btn.onClick.AddListener(() => {
            var heroModelGo = this.CreateModel();
            var weaponGo = this.CreateWeapon();
            var dummyRHand = heroModelGo.GetComponent<HeroModel>().dummyRHand;
            weaponGo.transform.SetParent(dummyRHand, false);
        });
    }

    private GameObject CreateModel()
    {
        return Instantiate(this.heroPrefab);
    }
    private GameObject CreateWeapon()
    {
        return Instantiate(this.weaponPrefab);
    }

}

 

>HeroModel.cs 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HeroModel : MonoBehaviour
{

    public Transform dummyRHand;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

'c# 강의 > 유니티' 카테고리의 다른 글

20200511 - FindWithTag (자주 쓰이는 예제 필요)  (0) 2020.05.11
20200508 - 프리팹  (0) 2020.05.08
20200508 - 벡터1  (0) 2020.05.08
20200508 - 복습  (0) 2020.05.08
20200507 - 오브젝트 생성 및 부모설정(Instantiate)  (0) 2020.05.08
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class App : MonoBehaviour
{

    public GameObject hero;
    public GameObject monster;

    void Start()
    {
        float distance = Vector3.Distance(this.hero.transform.position, this.monster.transform.position);

        Vector3 c = this.hero.transform.position - this.monster.transform.position;
        // 방향은 모른다.
        Debug.Log(c.magnitude);

        // 정규화 시켜서 길이를 1로 만든다. 그럼 방향을 알수 있다.
        Debug.Log(c.normalized);
        
    }
}

ctor3 distance 는 벡터의 길이
길이가 1인 벡터를 만든다. 단위 벡터 
비교하기 쉽게하기 위해

'c# 강의 > 유니티' 카테고리의 다른 글

20200508 - 프리팹  (0) 2020.05.08
20200507 - 캐릭터 생성 및 무기 장착  (0) 2020.05.08
20200508 - 복습  (0) 2020.05.08
20200507 - 오브젝트 생성 및 부모설정(Instantiate)  (0) 2020.05.08
20200507 - 애니메이션2  (0) 2020.05.08

> gameObject의 App 컴포넌트가 비활성화시 Awake 함수 호출됨

그러나 gameObject 가 비활성화시 Awake 함수 호출안됨

App 컴포넌트가 활성화 되면 Start함수는 한번만 호출됨

App 컴포넌트가 활성화 되면 update 매프레임마다 호출되지만 비활성화시 update함수 호출 안됨

App 컴포넌트에 ㅂ줕어 있는 gameObject가 비활성화시 update함수 호출 안됨

플레이를 멈췄을 경우 Ppp컴포넌트의 OnDestory 함수 호출됨

 

 

 

 

 


 

> 오브젝트,스크립트 설정

 

 


> App.cs

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class App : MonoBehaviour
{
    public Hero hero;
    public GameObject[] arrHeroModels;
    public string modelName;

    // Start is called before the first frame update
    void Start()
    {
      //  this.modelName = "";
        Debug.Log(this.modelName.ToString());

        this.hero.Init(this.CreateModel(this.modelName));
    }

    private GameObject CreateModel(string modelName)
    {
        GameObject foundModel = null;
        foreach (GameObject model in this.arrHeroModels)
        {
            if (model.name == modelName)
            {
                foundModel = model;
                break;
            }
        }
        Debug.LogFormat("model: {0}", foundModel);

        //게임오브젝트를 생성함 
        var newModel = UnityEngine.Object.Instantiate(foundModel);
        return newModel;
    }
}

 

> Hero.cs

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hero : MonoBehaviour
{
    public GameObject hero;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    public void Init(GameObject newModel)
    {
        //newModel.transform.SetParent(this.transform);
        newModel.transform.SetParent(this.transform, false);
        Debug.Log("zzzz"); 
    }
    
}

'c# 강의 > 유니티' 카테고리의 다른 글

20200508 - 벡터1  (0) 2020.05.08
20200508 - 복습  (0) 2020.05.08
20200507 - 애니메이션2  (0) 2020.05.08
20200507 - 애니메이션  (0) 2020.05.07
20200507 - 유니티(MonoBehaviour), 라이프사이클  (0) 2020.05.07

 

> 타격 프레임 code

더보기
public GameObject model;
public Button btn;
public int attackFrame;

private Animation anim;
private AnimationState state;

public int attackFrame;
private float totalFrames;
private float attackTime;
private float elapsedTimeAttack;  //타격 시간 
private float elapsedTimeAttackComplete;  //공격 애니메이션 종료 시간 
private bool isAttackAnimationPlaying;  //공격애니메이션 실행중인지 
private bool isAttack;  //공격을 했는지 

void Start()
{
    this.anim = this.model.GetComponent<Animation>();
    this.state = this.anim["attack_sword_01"];
    this.totalFrames = state.length * state.clip.frameRate;
    // fps의 뜻 (60fps, 30fps, 29.97fps, 24fps) 
    // 영상에서 매 초당 보여지는 이미지 장면의 수, 즉 프레임이 재생되는 속도

    // 22 : 8 = 0.733 : x 
    // 8 * 0.733 / 22 = x 
    this.attackTime =
        this.attackFrame * state.length / this.totalFrames;

}

void Update()
{
    //공격 애니메이션 실행 중이라면 
    if (this.isAttackAnimationPlaying)
    {
        //경과시간 누적 
        this.elapsedTimeAttack += Time.deltaTime;
        if (this.elapsedTimeAttack >= this.attackTime)
        {
            if (!this.isAttack)
            {
                //공격을 했는지 
                Debug.Log("타격!");
                this.isAttack = true;
            }
        }

        this.elapsedTimeAttackComplete += Time.deltaTime;

        if (this.elapsedTimeAttackComplete >= this.state.length)
        {
            //공격 애니메이션 종료 
            this.elapsedTimeAttack = 0;
            this.elapsedTimeAttackComplete = 0;
            this.isAttack = false;
            this.isAttackAnimationPlaying = false;
            this.anim.Play("idle@loop");
            Debug.Log("공격 애니메이션 종료");
        }
    }
}

 

> 이동

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
 
public class App : MonoBehaviour
{
    public Animation anim;
    public Button btnMoveForward;
    public Button btnMoveBack;
    public Button btnMoveLeft;
    public Button btnMoveRight;
    public Button btnStop;
    public float speed;
 
    private bool isMove;
    private Vector3 dir;
 
 
    void Start()
    {
        this.btnMoveForward.onClick.AddListener(() => {
            this.Move(Vector3.forward);
        });
 
        this.btnMoveBack.onClick.AddListener(() => {
            this.Move(Vector3.back);
        });
 
        this.btnMoveRight.onClick.AddListener(() => {
            this.Move(Vector3.right);
        });
 
        this.btnMoveLeft.onClick.AddListener(() => {
            this.Move(Vector3.left);
        });
 
 
        this.btnStop.onClick.AddListener(() => {
            Debug.Log("Stop");
            this.Stop();
        });
    }
 
    private void Move(Vector3 dir) {
        this.dir = dir;
        this.anim.Play("run@loop");
        this.isMove = true;
    }
 
    private void Stop() {
        this.isMove = false;
        this.anim.Play("idle@loop");
    }
 
    private void Update()
    {
        if (this.isMove) {
            this.anim.gameObject.transform.Translate(this.dir * this.speed * Time.deltaTime);
        }
    }
}

* 방향, 속도, 시간

 

> 오브젝트와의 거리 계산

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
 
public class App : MonoBehaviour
{
    public GameObject model;
    public GameObject target;
    public Button btnMove;
 
    private bool isMove;
    private Animation anim;
 
    void Start()
    {
        this.anim = this.model.GetComponent<Animation>();
 
        this.btnMove.onClick.AddListener(() => {
            this.Move();
        });
    }
 
    private void Move() {
        this.isMove = true;
        this.anim.Play("run@loop");
    }
 
    private void Stop() {
        this.isMove = false;
        this.anim.Play("idle@loop");
    }
 
    private void Update()
    {
        if (this.isMove) {
            //float
            var distance = Vector3.Distance(model.transform.position,
                target.transform.position);
 
            //move
            var speed = 1.2f;
            var dir = Vector3.forward;
            this.model.transform.Translate(speed * dir * Time.deltaTime);
 
            Debug.Log(distance);
 
            if (distance <= 0.03f)
            {
                this.model.transform.position = this.target.transform.position;
                this.Stop();
            }
        }
 
    }
}

 

> 히트&다이(프레임계산 적용)

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
 
public class App : MonoBehaviour
{
    public GameObject model;
    public GameObject target;
    public Button btnMove;
    public float attackDely;
 
    private bool isMove;
    private bool isAttack;
    private Animation heroAnim;
    private Animation monsterAnim;
    private float elapsedTime;
    private int attackFrame;
    private float totalFrames;
    private float attackTime;
    private int attackCount;    //공격 몇번 했는지 카운트 
    private bool isImpact;   //타격 했나?
    private AnimationState attackAnimState;
    private bool isMonsterHit;
    private float monsterHitElapsedTime;
    private float monsterAttackDamageAnimLength;
    private float attackDelayElapsedTime;
    private bool isContinousAttack;
    private bool isMonsterDie;
    private float monsterDieElapsedTime;
    private float monsterDieAnimationLength;
 
 
    void Start()
    {
        //init
        this.attackFrame = 8;
        this.heroAnim = this.model.GetComponent<Animation>();
        this.monsterAnim = this.target.GetComponent<Animation>();
        this.monsterAttackDamageAnimLength = this.monsterAnim["Anim_Damage"].length;
        this.monsterDieAnimationLength = this.monsterAnim["Anim_Death"].length;
 
        this.attackAnimState = this.heroAnim["attack_sword_01"];
        this.totalFrames = this.attackAnimState.length * this.attackAnimState.clip.frameRate;
        //22 : 8 = 0.733 : x 
        // x = 8 * 0.733 / 22
        this.attackTime = this.attackFrame * this.attackAnimState.length / this.totalFrames;
 
        this.btnMove.onClick.AddListener(() => {
            this.Move();
        });
    }
 
    private void Move() {
        this.isMove = true;
        this.heroAnim.Play("run@loop");
    }
 
    private void Stop() {
        this.isMove = false;
        this.Idle();
    }
 
    private void Idle() {
        this.heroAnim.Play("idle@loop");
    }
 
    private void Attack() {
        this.isAttack = true;
        this.heroAnim.Play("attack_sword_01");
    }
 
    private void MonsterHit() {
        this.isMonsterHit = true;
        this.monsterAnim.Play("Anim_Damage");
    }
 
    private void MonsterIdle() {
        this.isMonsterHit = false;
        this.monsterAnim.Play("Anim_Idle");
    }
 
    private void Update()
    {
        if (this.isMove) {
            //float
            var distance = Vector3.Distance(model.transform.position,
                target.transform.position);
 
            //move
            var speed = 1.2f;
            var dir = Vector3.forward;
            this.model.transform.Translate(speed * dir * Time.deltaTime);
 
            if (distance <= 0.5f)
            {
                this.Stop();
                this.Attack();
            }
        }
 
        if (this.isAttack) {
 
            this.elapsedTime += Time.deltaTime;
            if (this.elapsedTime >= attackTime)
            {
                if (this.isImpact == false) {
                    isImpact = true;
                    this.MonsterHit();
                }
            }
 
            if (this.elapsedTime >= this.attackAnimState.length) {
                //공격 완료 
                this.isAttack = false;
                this.isImpact = false;
                this.elapsedTime = 0;
                this.attackCount++;
 
                Debug.Log(this.attackCount);
                
                this.Idle();
 
                if (this.attackCount >= 3) {
                    this.isContinousAttack = false;
                    this.MonsterDie();
                }
 
                
            }
        }
 
 
        if (this.isMonsterHit) {
            this.monsterHitElapsedTime += Time.deltaTime;
            if (this.monsterHitElapsedTime >= monsterAttackDamageAnimLength)
            {
                this.monsterHitElapsedTime = 0;
                this.MonsterIdle();
                this.isContinousAttack = true;
            }
        }
 
        if (this.isContinousAttack) {
            this.attackDelayElapsedTime += Time.deltaTime;
            if (this.attackDelayElapsedTime >= this.attackDely) {
                this.attackDelayElapsedTime = 0;
                this.isContinousAttack = false;
                this.Attack();
            }
        }
 
        if (this.isMonsterDie) {
            this.monsterDieElapsedTime += Time.deltaTime;
            if (this.monsterDieElapsedTime >= this.monsterDieAnimationLength) {
                UnityEngine.Object.Destroy(this.target.gameObject);
            }
        }
 
    }
 
    private void MonsterDie()
    {
        this.monsterAnim.Play("Anim_Death");
        this.isMonsterDie = true;
    }
}
 

 

using UnityEngine.UI; // 버튼 사용하려면  2019.3.7

public class App : MonoBehaviour
{
    public GameObject model; //구멍을 뚫어
    public Button btn; // 버튼 인스턴스

 

> 버튼 클릭시 리스너

 this.btn.onClick.AddListener(메소드());
        this.btn.onClick.AddListener(() =>
        {
            Debug.Log("test1");
        });

> 프레임 시간

timer += Time.deltaTime;

 

> 애니메이션 컴포넌트 먼저가져와야함(model은 GameObaect)

  var anim = this.model.GetComponent<Animation>(); // 애니 컴포넌트 가져와

 

> 애니메이션

var state = anim["attack_sword_01"]; // 애니메이션 컴포넌트 활용

 anim.Play("attack_sword_01"); //애니메이션 실행

 


 

MonoBehaviour

Awake - Start - Update

 

> Awake

- 인스턴스가 메모리에 오라가고,  로딩 될 때, 호출

- 마치 생성자와 같다.
- 미리 정의되어 있다. 

- 종료 될 때까지 한 번만 실행된다. 

 

 

> start (스크립트가 실행 될 때 한번)

Start는 Update메소드가 처음 호출되기 바로 전에 호출됩니다.

 

 

> Update

- Update는 MonoBehaviour가 활성화 되어 있는 경우에, 매 프레임마다 호출됩니다.

- Update는 게임 동작을 수행하기위해 가장 흔하게 사용되는 기능입니다.

지난 Update호출로부터의 경과시간을 받아오고 싶은 경우에, Time.deltaTime을 사용합니다. Behaviour가 활성화 되어있는 경우에만 호출됩니다. 사용자 컴포넌트의 기능을 제공하기 위해 함수를 오버라이드(override)해서 사용할 수 있습니다.

 

 


> 라이프사이클

 

 

> 정리 코드 - 참고

더보기
public class App : MonoBehaviour
{
    //인스턴스가 로딩될때 한번만 호출됨 
    //게임오브젝트가 비활성화 일경우 호출 안됨 
    //게임오브젝트가 활성화 이고 컴포넌트가 비활성화 일경우 호출됨 
    private void Awake()
    {
        Debug.Log("App::Awake");
    }
 
    //게임오브젝트가 활성화 되었을경우 호출됨 
    //게임오브젝트가 비활성화 일경우 호출 안됨 
    //게임오브젝트가 활성화 이고 컴포넌트가 비활성화 일경우도 호출 안됨 
    private void OnEnable()
    {
        Debug.Log("App::OnEnable");
    }
 
    //오브젝트가 활성화 상태일경우 업데이트 함수 호출전에 한번만 호출됨 
    void Start()
    {
        Debug.Log("App::Start");
    }
 
    //오브젝트가 활성화 상태일경우 매프레임마다 호출됨 
    void Update()
    {
        Debug.Log("App::Update");
    }
 
    //오브젝트가 비활성화 일경우 호출됨 
    //인스턴스화 될때 게임오브젝트가 비활성화, 컴포넌트가 비활성일경우 호출안됨 
    //인스턴스화 되고 오브젝트또는 컴포넌트가 활성화에서 비활성화 되었을경우 호출됨 
    private void OnDisable()
    {
        Debug.Log("App::OnDisable");
    }
 
    //Object.Destroy 
    //씬 종료
    //오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 이 함수가 호출됩니다. 
 
    //오브젝트 활성화, 컴포넌트 활성화 : 
    //Awake - OnEnable - Staret - Update - OnDisable - OnDestory 
 
    //오브젝트 활성화, 컴포넌트 비활성화 : 
    //Awake - OnDestory 
 
    //오브젝트 비활성화, 컴포넌트 활성화 : X 
 
 
    private void OnDestroy()
    {
        Debug.Log("App::OnDestroy");
    }
}

'c# 강의 > 유니티' 카테고리의 다른 글

20200507 - 오브젝트 생성 및 부모설정(Instantiate)  (0) 2020.05.08
20200507 - 애니메이션2  (0) 2020.05.08
20200507 - 애니메이션  (0) 2020.05.07
20200506 - 설정2  (0) 2020.05.06
20200506 - 설정1  (0) 2020.05.06

 

 

 

 

 

 

 

그리드  - 1유닛 작은 상작

 

 

 

 

더보기

 

 

 

 

 

 

+ Recent posts