파렌하이트 MYPI

파렌하이트
접속 : 3822   Lv. 55

Category

Profile

Counter

  • 오늘 : 11 명
  • 전체 : 112338 명
  • Mypi Ver. 0.3.1 β
[작업] (0) 2018/05/03 PM 02:35

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEditor;


[CustomEditor(typeof(WorldMap3))]

public class MapEditor : Editor {


public override void OnInspectorGUI(){

base.OnInspectorGUI ();

WorldMap3 map = target as WorldMap3;

//map.CreateCube ();

if(GUILayout.Button("Generate")){

int seed = map.Seed;

map.RandomSeed (seed);

}

}

}

 

본문은 예시로 작성한 것이다.

에디터 상에서 굳이 플레이 상태로 진행하지 않고도 스크립트 상에서 이루어지는 오브젝트 생성, 제거, 수정등을 실시간으로 조절할 수 있다.

매 프레임마다 실행하므로, 가벼운 코드만 넣는편이 좋다.

 

구현하기 위해서는 몇가지 조건을 필요로한다.

1, Asset 내부에 Editor 폴더를 생성한다. 반드시 Editor 이름이어야한다.

2, Editor 폴더 내부에 스크립트를 생성하고, 최상단에 using UnityEditor를 넣는다.

3, 스크립트에 아래 구문들을 넣는다.

[CustomEditor(typeof(작동할 스크립트 명칭))]

public class MapEditor : Editor {

public override void OnInspectorGUI(){

작동할 스크립트 명칭 map = target as 작동할 스크립트 명칭;

}

}

4, 

3번의 map은 해당 스크립트에서 작동할 스크립트 명칭을 정하는것으로서 원하는 이름으로 작성한다.


신고

 
[작업] (0) 2018/05/03 AM 11:07

 

 

1,

void example(){

int[] p = new int[]{ 1, 2, 3, 4, 5, 6};


for (int i = 0; i < p.Length; i++) {

int rand = Random.Range (i, p.Length);

int temp = p [rand];

p [rand] = p [i];

p [i] = temp;


print (p [i]);

}

}

 

구문을 설명하기전에 먼저 작동원리부터 이해하는게 도움이 될 것이다.

지금까지 난수를 생성하기 위해서는 단순히 Random.Range(min, max)를 사용해 왔었다.

하지만 Random.Range는 난수를 생성하는 것 이상의 기능이 없어, 중복되지 않는 난수 또는 시드 값을 이용한 난수 생성은 구현할 수 없더라.

따라서 위의 구문은 배열 내 값을 순서를 섞어 중복되지 않게 출력하는 것인데, 지금이야 어느정도 이해를 하고서 이렇게 설명하고 있지만 나중에 이 글을 보았을때 여전히 기억하고 있으련지 걱정스러워 이렇게 글을 쓴다. 본격적으로 공부하는 것이 아니라 취미로 하고있다보니 어느순간 질리게 될게 분명한데, 그렇게되면 분명 이 내용도 까먹을것 같다.

 

예를 들어A, B, C, D 값을 갖는 배열이 있고 이 순서를 섞는다.

섞었더니 순서가 C, B, D, A가 나왔다면, 두번째로 섞을땐 배열의 첫번째 자리에 있는 C를 제외하고 섞는다.

따라서 B, D, A만을 가지고 순서를 섞게된다. 두번째에서 D, A, B가 나왔다면, 마찬가지로 첫번째 자리의 D를 제외하고 다시 순서를 섞는다.

세번째에서 A, B가 나왔다면 A를 제외하고 B를 가지고 순서를 섞어야하겠지만, 남은 배열값은 B 하나뿐이므로 그대로 B가 첫번째 자리에 있게된다.

처음부터 마지막까지 배열의 첫번째 자리에 뽑인 배열값을 나열하면 C, D, A, B가 된다.

즉, 섞는 횟수마다 배열의 첫째자리에 위치한 값을 제외하고서 배열을 나열하는 것으로, 중복된 값이 나오지 않게 만드는 것이다.

 

원리를 알고보니 지극히 단순하지만, 지금까지 몰랐으니 창피할 따름이더군.

위 구분은 설명을 코드로서 바꾼것 밖에 되지 않는다. 코드 자체는 단순하다. 원리를 아는게 중요하다.

 

 

2,

void RandGenerator(int seed){

int[] ar = new int[]{ 1, 2, 3, 4, 5, 6 };


System.Random Rand = new System.Random (seed);

for (int i = 0; i < ar.Length - 1; i++) {

int Index = Rand.Next (i, ar.Length);

int Temp = ar [Index];

ar [Index] = ar [i];

ar [i] = Temp;


print (ar [i]);

}

}

 

난수를 생성할때, 난수 생성의 기준이 되는 시드값을 주어 시드값에 따라 고정된 난수를 생성하게 한다.

즉, 시드값이 동일하다면 언제나 같은 난수 값을 생성한다.

 

전체적인 구문형태는 1번과 크게 다르지 않다.

하지만 System.Random이나 Rand(System.Random).Next 처럼 내가 처음으로 보는 코드가 있어 생소하게만 느껴진다.

먼저 구글링을 통해 이 두 코드를 찾아보았으나, 나오는것은 더욱더 날 어지럽게 만들었다. 설명이 또다른 의문을 만들더라.

주먹구구식으로 때려맞추고 이해하는식으로 2번을 구현하였다.

System.Random에 int형으로 시드값을 넘겨주어 난수를 생성하는 것으로 이해한다.

반복문을 통해 1번과 같이 배열은 순환하며 난수값을 생성하는데, Rand.Next에 반복문 i값을 주는 부분은 1번과 크게 다르지 않다.

1번처럼 순서를 바꾸면서 배열의 첫번째 자리의 값은 제외하는 식이다.

 

3,

public void RandomSeed(int seed){

Vector2[] Ar = new Vector2[FieldSize * FieldSize];

for (int i = 0; i < FieldSize; i++) {

for (int j = 0; j < FieldSize; j++) {

Ar [i + j * (int)FieldSize] = new Vector2 (i, j);

}

}


if (transform.childCount > 0) {

DestroyImmediate (transform.GetChild (0).gameObject);

}


GameObject Pocket = new GameObject ("Pocket");

Pocket.transform.parent = transform;


System.Random Rand = new System.Random (seed);

int ObstacleCount = (int)((FieldSize * FieldSize) * ObstacleRate);

for (int i = 0; i < ObstacleCount; i++) {

int Index = Rand.Next (i, Ar.Length);

Vector2 Temp = Ar [Index];

Ar [Index] = Ar [i];

Ar [i] = Temp;


GameObject Obj = Instantiate (Cube, new Vector3(Ar[i].x, 0, Ar[i].y), Quaternion.identity);

Obj.transform.localScale = new Vector3 (0.8f, 0.8f, 0.8f);

Obj.transform.parent = Pocket.transform;


}

}

 

3번은 2번을 응용하여 시드값에 의해 고정된 난수를 이용하여 큐브들을 생성하는 코드이다.

 

신고

 
[작업] 간만에 모델링 (3) 2017/12/22 PM 11:15

 

일주일 전

몇 달째 방치하다시피 내버려두었던 저가형 3D 프린터를 재가동하였다.

사실, 사소한(?) 사고로 인해 출력물을 고정하는 플레이트가 박살이 나버려 그대로 못쓰는가 싶었으나 테이프와 접착제 신공으로 겨우 고쳐놓았다.

출력물 퀄리티는 사고가 있기 전이나 지금이나 크게 다를바 없으나, 출력도중에 플레이트가 다시 부서질까 두렵다. -_-;

 

뭐, 아무튼 출력물은 나오니까 슬슬 뭐라도 하나 만들어볼까하여 이리저리 구글링을 하던중

가지고 놀기 좋고, 만들기 쉬운 전차를 하나 만들기로했다.

그리하여 탱크들을 찾아보건데 kv2 전차가 눈에 띄어 이걸 만들어보기로 했다.

 

KV_2U0_bp01.jpg

 

설계도...는 아니고 구성도를 보면 정말로 만들기 편하도록 구성되어있다.

다른 전차와 다르게 직선으로 이루어진 구조가 실제 전장에서 포탄맞고 폭발하기 딱 좋게 생겨먹었다.

꺼라위키를 살짝 살펴보니 크고 아름다운 전차포는 그 위력이 어마무시하였다는데, 알게 뭐람-_-; 

구조가 단순해서 만들기가 편하다는것 밖에 모르겠다.

파생형은 제법 많은데, 본문의 사진은 1939년형 기준이다. 후기형인 40년형 kv 전차는 구조가 비교적 더 직관적인데, 포문이 직각으로 전방을 향하고 있는 구성이라 본문처럼 일부러 각도를 주지 않아도 된다. 사실 차이점인 이게 다다. 굳이 더 찾아보자면 전방에 기관총 하나 달리는 정도려나

 

애니에서도 나오는듯 하다. 작중 취급은 꽤 안습한듯ㅋ


 

kv1.png

 

 

대충 이렇게 생겨먹었다.

 

 

kv2.png

 

 

측면은 요렇게 생겼다.

저 저질스러운 무한궤도와 휠 퀄리티를 보라-_-;


kv4.png

 

 

무한궤도 퀄리티가 저질인 이유는 간단하다.

모형으로 출력할 용도라서 일일히 궤도를 하나씩 만들어서 이어줄수 없다.

물론 시간과 노오오력이 충분하다면 시도해볼만 하지만, 본인은 의지가 굉장히 부족하다.

 

무한궤도와 휠을 통짜로 출력하는 방법도 생각해보았으나, 그래도 기왕 만드는거 도색까지 생각하고있다.

사실, 도색은 한번도 해본적이 없다. 전차니까 메탈 스프레이 같은걸 끼얹으면 폼이 나지 않을까?

 

포탑은 하부에 자석을 붙여 회전이 가능하도록하고, 포문은 포탑 내부에 끼어넣고 상하 움직임을 구현하려고한다.

좌우 회전은 쉬운데, 상하 움직임을 구현하는건 본문처럼 포탑 내부를 들어내고 포문을 끼워넣는 셈이라 단차가 생기면 큰 낭패다.

 

kv3.png

 

멋지게 렌더링을 하고 보기좋게 그림을 남기고싶지만, 할 줄 아는게 요것 뿐이다.

독학은 힘들다.

신고

 

시노자키아이유인나    친구신청

오 뵙기 힘든 마야유저 반갑습니다

야당검증위원회    친구신청

저도 당연 맥스유저겠지 생각했는데
국내에 보기드문 마야유저군요
우리나라에선 마야독학은 너무 힘들긴하죠

퓨르르르릉    친구신청

저도 기본은 지블과 맥스지만 넙스 모델링 할때는 마야만 씁니다.. 마야 좋아연~ ㅎㅎ
[작업] (0) 2017/08/31 PM 06:00

본 글은 비공개 게시물이며, 본인만 볼 수 있습니다.

신고

 
[작업] (0) 2017/06/14 AM 10:47

본 글은 비공개 게시물이며, 본인만 볼 수 있습니다.

신고

 
1 2 현재페이지3 4 5 다음
X