2016년 12월 8일 목요일

[C#] 유니티 재귀함수 (Feat.구구단) ([C#] Unity Recursive function(Feat.multiplication table)

using UnityEngine;
using System.Collections;

public class Data : MonoBehaviour {

    int num_1, num_2;

    void Start()
    {
        num_1 = 2;
        num_2 = 1;

        mul(num_1, num_2);
    }
    public int mul(int a, int b)
    {
        int num = 0;
        if (b == 10)
        {
            a += 1;
            b = 1;
            return mul(a, b + 1);
        }

        if (a > 10)
        {
            return 0;
        }
        num = a * b;
        show(a, b, num);
        return mul(a , b + 1);
    }

    public void show(int a, int b, int num)
    {
        Debug.Log(a + "단 :" + a + " x " + b + " = " + num);        
    }
}
- 간단한 코드라 자세한 설명은 생략한다.

결과

2016년 11월 29일 화요일

[C#] 유니티로 미니게임 제작하기(2) ([C#]Creating a mini game with Unity(2))

툴을 설치해 보자.

1. Magica Voxel
- 게임에 필요한 그래픽 제작하기


- 위 홈페이지 링크에 들어가게 되면, 다운받기가 바로 나올것이다. 
홈페이지에 업데이트되는 부분과 어떤 기능들을 할 수 있는지 있으니 참고하기 바란다. 



- 다운받은 파일 모습


- MagicaVoxel 을 실행시킨 모습이다. 현재 이미지는 Chr_sword를 선택한 모습이다.
==========================================================
Palette : 색
==========================================================
Brush L : line Mode
Brush C : Center Mode
Brush P : Patten Mode
Brush V : Vertex Mode
Brush F : Face Mode
Brush B : Box Mode
==========================================================
Attach : Attach Voxels          
Erase : Erase Voxels
Paint : Paint Voxels
Move : Move Model
==========================================================
Mirror x,y,z : x,y,z좌표에 그린다면 -x, -y, -z 좌표에 그려준다.
==========================================================


이렇게 만든 오브젝트를 Export부분으로 추출해준다.
파일형식은 obj로 추출해서 유니티에 넣으면

- 이런식이 되는데 폴리곤수가 이상하게 많아보인다. 빗금 표시가 캐릭터 블럭 색 마다 표시되어있는데 최적화가 필요할것 같다.

최적화 하지않은 오브젝트를 사용하면 게임이 커질수록 불리해 지게 된다.

2. Voxel Shop
- 오브젝트 최적화 방법




- 다운로드를 클릭하면 밑에 사용자 OS에 맞게 다운받을 수 있다.


- file -> import


- Downloads\MagicaVoxel-0.98.-win-mac\MagicaVoxel-0.98\vox 경로에 있는 .vox 파일형식을 import 시켜준다. 
- import 시켜준 모습.
우리는 폴리곤만 줄이면 되기때문에 여기서 추가 작업은 없고, export만 시켜주도록 하겠다.



- export할 이름을 적고 경로를 지정해주면 되겠다.


- export 한 파일


- 파일을 유니티 에셋 폴더에 끌어다 놓은 모습.


- 뭔가 이상하다. 텍스쳐가 들어간것 같지만, 매우 부자연스럽게 입혀져있다.



- 텍스쳐를 선택하고 텍스쳐 타입을 Advanced를 선택한다.



- Non Power of 2를 None으로 선택하고 Generate Mip Maps를 체크해제 해준다.
그리고 Filter Mode를 Point(no filter)로 선택해 준다. 그리고 Apply를 눌러주면


-이렇게 입혀지게된다. 근데 뭔가 어딘가 이상하다...ㅜㅜ;;
색이 번지는듯한 느낌....

찾아보니까~ 음~~~~~ 하...

Generate Mip Maps를 잘못 사용해서 그런것이라고 한다.
https://docs.unity3d.com/kr/current/Manual/class-TextureImporter.html

유니티 메뉴얼에 따르면,
" 이것을 선택하면 밉맵의 생성이 활성화됩니다. 밉맵은 더 작은 텍스처로, 텍스처가 화면상에서 아주 작은 경우에 사용됩니다. 자세한 내용은 페이지 마지막의 Details 섹션을 참조하십시오."

라고 하는데... 이것을 다시 활성화 시켜주면!




- 잘 나온다.!!!!!!!!!!!
이렇게 유니티에 넣어주면,


- 캐릭터의 폴리곤이 최적화 된것을 두 눈으로 직접 확인할 수 가 있다.


==========================================================솔직히 너무 귀찮다... 시간이 된다면, 조금더 간단한 방법으로 최적화 하는 방법을 생각해 봐야겠다.... 아...  블로그 글쓰기 힘들다... ;;;

애니메이션은 언제하고... 배경은 언제만들고... 유아이 스크립트는!! 서버는!! 언제!!!


하... 들어가서 작업하면 안될까?








[C#] 유니티로 미니게임 제작하기(1) ([C#]Creating a mini game with Unity(1))

 1. 어떤 컨셉으로 게임을 제작할 것인가?



- 필자는 그래픽을 전문적으로 다루는 사람이 아니라, 개발을 할 때에 다른 게임 그래픽에 비해 신경을 많이 쓰고 싶지 않았다. 따라서 쉽고, 간편한 제작 툴이 있으면 좋겠다 하여, 생각해 낸 것이 도트방식의 그래픽 이다. (아마도... 더 복잡할지도 모르겠다...--;;;)

 여러 그래픽 툴을 찾아 본 바로는
1. Magica Voxel
- 매우 개방적인 툴이며, 개인적으로 매우 간편하며, 상대적으로 매우 단순한 유아이를 가졌다.

2. Voxel Shop
- Magica Voxel 과 같은 식 이지만, 더 많은 기능들을 제공하는것 같다...........

3. Qubicle 3D
- 보통의 경우 이쪽 툴을 많이 사용한다고 한다. 사용하기위해 라이센스를 얻으려면 비용을 투자해야 한다고 알고있다. 그냥 단순하게 배우는 용으로는 무료라고 한다.
아무튼 돈을써야지만, 상업적 이용이 가능하단 소리다.


필자는 1,2번을 사용하여 그래픽을 제작할 것인데... 왜 두가지를 쓰는지는 추후에 설명하겠다. 개인적으로 걱정이 제일 많은 부분이다.... 하..;;;

2016년 11월 10일 목요일

[C#] 유니티 그래프 스크립트 ([C#]Graph Script at Unity)


So here is the script.

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

public class BarGraphManager : MonoBehaviour {

    public GameObject linerenderer;
    public GameObject pointer;

    public GameObject HolderPrefb;

    public GameObject holder;

    public Material mat;

    public Text topValue;

    public List<GraphDatagraphData = new List<GraphData>();

    private GraphData gd;
    private float highestValue;

    void Start(){
        UpdateData();
    }
    
    public void UpdateData() {

        // Instantiate an empty gameObject to hold all line renderers
        holder = Instantiate(HolderPrefb,Vector3.zero,Quaternion.identityas GameObject;
        holder.name = "h2";

        graphData.Clear();

        // Lenght of data to be shown in graph
        int length = Random.Range(5,12);
        // Inserting data to the list
        for(int i = 0i < lengthi++)
        {
            gd = new GraphData();

            gd.income = Random.Range(10.0f,100.0f);

            if(gd.income > highestValue)
                highestValue = gd.income;

            graphData.Add(gd);
        }

        // Adjusting value to fit in graph
        for(int i = 0i < graphData.Counti++)
        {
            // since Y axis is from 0 to 3 we are dividing the income with the highest income
            // so that we get a value less than or equals to 1 and than we can multiply that
            // number with Y axis range to fit in graph
            // e.gincome = 90highest = 90 so 90/90 = 1 and than 1*3 = 3 so for 90Y = 3
            graphData[i].income = (graphData[i].income/highestValue)*3;
        }

        topValue.text = Mathf.FloorToInt(highestValue).ToString();

        StartCoroutine("BarGraph",graphData);
    }

    IEnumerator BarGraph(List<GraphDatagd)
    {

        float gap = 1;

        // X axis starts from 0 to 4 so according to my logic i have to check if noof data
        // is > 4 than we should divide the lenght of x axis with the data countthis will
        // give us the gap between bars that we need to keep.

        if(gd.Count > 4)
        {
            gap = 4.0f/gd.Count;
        }

        float xIncrement = gap;
        int dataCount = 0;
        Vector3 startpoint = Vector3.zero;

        while(dataCount < gd.Count)
        {

            Vector3 endpoint = new Vector3(xIncrement,gd[dataCount].income,0.96f);
            startpoint = new Vector3(endpoint.x,0,0.96f);
            // pointer is an empty gameObjecti made a prefab of it and attach it in the inspector
            GameObject p = Instantiate(pointernew Vector3(startpoint.xstartpoint.y0.97f),Quaternion.identityas GameObject;
            p.transform.parent = holder.transform;

            // linerenderer is an empty gameObject with Line Renderer Component Attach to it
            // i made a prefab of it and attach it in the inspector
            GameObject lineObj = Instantiate(linerenderer,transform.position,Quaternion.identityas GameObject;
            lineObj.transform.parent = holder.transform;
            lineObj.name = dataCount.ToString();

            LineRenderer lineRenderer = lineObj.GetComponent<LineRenderer>();
            
            lineRenderer.material = mat;
            lineRenderer.SetWidth(0.15F0.15F);
            lineRenderer.SetVertexCount(2);

            while(p.transform.position.y < endpoint.y)
            {
                p.transform.Translate(Vector3.up*Time.deltaTime*8Space.World);
                
                lineRenderer.SetPosition(0startpoint);
                lineRenderer.SetPosition(1p.transform.position);
                
                yield return null;
            }

            lineRenderer.SetPosition(0startpoint);
            lineRenderer.SetPosition(1endpoint);

            
            p.transform.position = endpoint;

            startpoint = endpoint;
            dataCount++;
            xIncrement+= gap;

            yield return null;

        }
    }



    public class GraphData
    {
        public float income;
    }
}


출처 : http://cafe.naver.com/unityhub