유니티 새로운 씬 하나 만들고 게임오브젝트 하나 만들어서 여기다가 Class_A , Class_B 스크립트 컴포넌트 만들어서 붙여줬음
그리고 밑에 코드가 각각 스크립트 코드임
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Class_A : MonoBehaviour {
public class Data
{
public int id;
}
public Data[] arr = new Data????;
Class_B _B;
private void Awake()
{
for(int i =0; i {
arr[i] = new Data();
}
_B = GetComponent();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.F1))
{
add(1000);
}
if (Input.GetKeyDown(KeyCode.F2))
{
add(2000);
}
if (Input.GetKeyDown(KeyCode.F3))
{
Debug_check();
}
}
int index;
void add(int num)
{
if (index {
_B.cg_num(num);
arr[index] = _B.key_value; // arr[index].id = _B.key_value.id;
index++;
}
}
void Debug_check()
{
for(int i = 0; i {
Debug.Log(arr[i].id);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Class_B : MonoBehaviour {
public Class_A.Data key_value = new Class_A.Data();
public void cg_num(int num)
{
if (num == 1000)
{
key_value.id = 1;
}
if (num == 2000)
{
key_value.id = 2;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
이게 뭐냐면 F1 눌렀을 때 10개의 배열 공간에 차례대로 0번 인덱스 부터 1이 라는 값이 쌓이고
F2를 누르면 2라는 값이 쌓임 , F3 눌렀을 때 결과값 확인하는 코드인데
F1F1F2F2F3 << 이런식으로 누르면 배열은 1122000000 이런식으로 들어와야되
그런데 저 위에 코드 대로 하면 마지막에 눌렀던 값으로 처음부터 다 값이 변경이 되버림 즉, 2222000000 이렇게
이 상태에서 F1 한번 누르고 F3 누르면, 1111100000 이렇게 값이 바뀌고...
그래서 내가 왜이럴까 하고 코드를 중간에 건드려봤는데 Class_A 코드 중간에 보면 주석처리 된 코드로 그 줄 바꾸면 (arr[index].id = _B.key_value.id;)
내가 원하던 대로 되기는 하거든? 근데 이게 무슨 차이때문에 저렇게는 모든 배열이 마지막 값으로 다 바뀌는지 이해가 안됨;
뭔가 내가 놓친부분이 있나 싶기도 하고.. 왜 저러는 걸까?
public Data[] arr = new Data????; << 이부분은 올리니깐 깨진거 ???? 대신 +
올리니깐 깨지는 코드 많네.. for문 이랑 if문 i랑 index는 10미만 이라고 해석하시믄됨..
arr[index] = _B.key_value; 여기가 문제임 값과 참조의 차이를 검색해봐
arr[index]는 주소값을 가지고 있는 포인터의 배열임. _B.key_value도 마찬가지로 클래스를 가리키는 포인터임. 포인터에 포인터를 대입했으니 그냥 주소값만 바뀌지 주소가 가리키는 곳의 값은 바뀌지 않아, 결국 arr[0~index]는 모두 같은 주소를 참조하고 있어서 2만 보이는 것임
ㄷㄷ 그렇구나.. 결국엔 클래스의 데이터들을 다 일일이 대입해야 하는 방법밖에 없겟네..
클래스 말고 구조체를 쓰면댐
오 깔끔 하게 해결됬다 고맙다 ㅋㅋ