2020년 5월 24일 일요일

[Unity] gridOverLay




https://gist.github.com/DongguemYoo/0e848cafcaa3e4b549fd21d8fd7bd686


using UnityEngine;
using System.Collections;

public class gridOverlay : MonoBehaviour
{

    public GameObject plane;

    public bool showMain = true;
    public bool showSub = false;

    public int gridSizeX;
    public int gridSizeY;
    public int gridSizeZ;

    public float smallStep;
    public float largeStep;

    public float startX;
    public float startY;
    public float startZ;

    private float offsetY = 0;
    private float scrollRate = 0.1f;
    private float lastScroll = 0f;

    public Material lineMaterial;

    private Color mainColor = new Color(0f, 1f, 0f, 1f);
    private Color subColor = new Color(0f, 0.5f, 0f, 1f);

    public delegate void SetStap(float cam_distance);
    public static SetStap del_StepSize;
 


    void Start()
    {
//이거를 카메라에 달면 됨 아직 디테일은 수정중
        del_StepSize += func_SetSmallStep;
    }

    public void func_SetSmallStep(float cam_distance)
    {
        largeStep =  cam_distance / 2;
        smallStep = cam_distance / 10;
    }

    void Update()
    {
        if (lastScroll + scrollRate < Time.time)
        {
            if (Input.GetKey(KeyCode.KeypadPlus))
            {
                plane.transform.position = new Vector3(plane.transform.position.x, plane.transform.position.y + smallStep, plane.transform.position.z);
                offsetY += smallStep;
                lastScroll = Time.time;
            }
            if (Input.GetKey(KeyCode.KeypadMinus))
            {
                plane.transform.position = new Vector3(plane.transform.position.x, plane.transform.position.y - smallStep, plane.transform.position.z);
                offsetY -= smallStep;
                lastScroll = Time.time;
            }
        }
    }

    void CreateLineMaterial()
    {

        if (!lineMaterial)
        {
            lineMaterial = new Material("Shader \"Lines/Colored Blended\" {" +
                "SubShader { Pass { " +
                "    Blend SrcAlpha OneMinusSrcAlpha " +
                "    ZWrite Off Cull Off Fog { Mode Off } " +
                "    BindChannels {" +
                "      Bind \"vertex\", vertex Bind \"color\", color }" +
                "} } }");
            lineMaterial.hideFlags = HideFlags.HideAndDontSave;
            lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
        }
    }

    void OnPostRender()
    {
        CreateLineMaterial();
        // set the current material
        lineMaterial.SetPass(0);

     
     
        GL.Begin(GL.LINES);

        if (showSub)
        {
            GL.Color(subColor);

            //Layers
            for (float j = 0; j <= gridSizeY; j += smallStep)
            {
                //X axis lines
                for (float i = 0; i <= gridSizeZ; i += smallStep)
                {
                    GL.Vertex3(startX, j + offsetY, startZ + i);
                    GL.Vertex3(gridSizeX, j + offsetY, startZ + i);
                }

                //Z axis lines
                for (float i = 0; i <= gridSizeX; i += smallStep)
                {
                    GL.Vertex3(startX + i, j + offsetY, startZ);
                    GL.Vertex3(startX + i, j + offsetY, gridSizeZ);
                }
            }

            //Y axis lines
            for (float i = 0; i <= gridSizeZ; i += smallStep)
            {
                for (float k = 0; k <= gridSizeX; k += smallStep)
                {
                    GL.Vertex3(startX + k, startY + offsetY, startZ + i);
                    GL.Vertex3(startX + k, gridSizeY + offsetY, startZ + i);
                }
            }
        }

        if (showMain)
        {
            GL.Color(mainColor);

            //Layers
            for (float j = 0; j <= gridSizeY; j += largeStep)
            {
                //X axis lines
                for (float i = 0; i <= gridSizeZ; i += largeStep)
                {
                    GL.Vertex3(startX, j + offsetY, startZ + i);
                    GL.Vertex3(gridSizeX, j + offsetY, startZ + i);
                }

                //Z axis lines
                for (float i = 0; i <= gridSizeX; i += largeStep)
                {
                    GL.Vertex3(startX + i, j + offsetY, startZ);
                    GL.Vertex3(startX + i, j + offsetY, gridSizeZ);
                }
            }

            //Y axis lines
            for (float i = 0; i <= gridSizeZ; i += largeStep)
            {
                for (float k = 0; k <= gridSizeX; k += largeStep)
                {
                    GL.Vertex3(startX + k, startY + offsetY, startZ + i);
                    GL.Vertex3(startX + k, gridSizeY + offsetY, startZ + i);
                }
            }
        }


        GL.End();
    }
}


using UnityEngine;
using System.Collections;

public class gridOverlay : MonoBehaviour
{

    public float minval;
    public float maxval;

    public int rectSize;

    public bool isLevel1;
    public bool isLevel2;
    public bool isLevel3;
    public bool isLevel4;

    public float level1_Step;
    public float level2_Step;
    public float level3_Step;
    public float level4_Step;


 

    private float offsetY = 0;
    private float scrollRate = 0.1f;
    private float lastScroll = 0f;

    public Material lineMaterial;

    private Color Color_level1 = new Color(0f, 0f, 0f, -0.2f);
    private Color Color_level2 = new Color(0f, 0f, 0f, 0f);
    private Color Color_level3 = new Color(0f, 0f, 0f, 0f);
    private Color Color_level4 = new Color(0f, 0f, 0f, 0f);



    public delegate void ColorChange(float distance);
    public static ColorChange del_ColorChange;
 


    void Start()
    {
        //lineMaterial.hideFlags = HideFlags.HideAndDontSave;
        //lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
        level1_Step = 2000;
        level2_Step = 1000;
        level3_Step = 100f;
        level4_Step = 10f;

        del_ColorChange += func_ColorChange;


        //휠할때마다 다시 그린다? 그것도 개 애바
        //StartCoroutine(draw_Line(level1_Step, Color_level1, 0));
     

    }

    public void Update()
    {
        if (Input.GetKeyDown("1"))
        {
            isLevel1 = true;
        }
        if (Input.GetKeyDown("2"))
        {
         
        }
    }

    public void func_ColorChange(float dis)
    {
     
        //f_setColor(dis, 3, 180, ref Color_level4);
        f_setColor(dis, 17000, 70000, ref Color_level1);
        f_setColor(dis, 2000, 14000, ref Color_level2);
        f_setColor(dis, 100, 2000, ref Color_level3);
        f_setColor(dis, 0, 100, ref Color_level4);

        f_setActive(dis);
    }

    void f_setColor(float dis,float min,float max,ref Color color)
    {
        float tmp_val;
        tmp_val = ((1 - ((dis - min) / (max - min))) * -1f);

        if (max < dis && color.a !=0)
        {
            if (max != 70000)
            {
                //level1 은 사라지지 않게
                color = new Color(0f, 0f, 0f, 0f);
            }
        }

        if (min < dis && dis < max)
        {

            if (max == 70000)
            {
                //level1 은 사라지지 않게
                if (tmp_val < -0.2f)
                {
                    color = new Color(0f, 0f, 0f, tmp_val);
                }
            }
            else
            {
                if (tmp_val > -0.4f)
                    color = new Color(0f, 0f, 0f, tmp_val);
            }
        }
        else if (min > dis)
        {
            color = new Color(0f, 0f, 0f, tmp_val);
        }
    }

    void f_setActive(float dis)
    {
        if (30000 > dis && dis > 14000)
        {
            isLevel3 = false;
            isLevel4 = false;
        }
        else if (14000 > dis && dis > 2000)
        { 
            isLevel3 = true;
            isLevel4 = false;
        }
        else if (2000 > dis && dis > 100)
        { 
            isLevel3 = true;
            isLevel4 = true;
        }
    }

    IEnumerator draw_Line(float level, Color color, float offset)
    {
        //Debug.Log("Draw_Action");

        lineMaterial.SetPass(0);
        GL.Begin(GL.LINES);
        GL.Color(color);

        //startX = -rectSize;
        //startZ = -rectSize;

        int count = 0;



        for (float i = 0; i <= rectSize; i += level)
        {
            if (offset == 0)
            {
                if (count % 5 == 0)
                {
                    GL.Vertex3(-rectSize, offsetY, -rectSize + i);
                    GL.Vertex3(rectSize, offsetY, -rectSize + i);

                    //z축
                    GL.Vertex3(-rectSize + i, offsetY, -rectSize);
                    GL.Vertex3(-rectSize + i, offsetY, rectSize);

                    //- 반대편 z축
                    GL.Vertex3(i, offsetY, -rectSize);
                    GL.Vertex3(i, offsetY, rectSize);
                    //- 반대편 x축
                    GL.Vertex3(-rectSize, offsetY, i);
                    GL.Vertex3(rectSize, offsetY, i);
                }
            }
            else if (count % offset != 0)
            {
                if (i != rectSize)
                {
                    //Debug.Log("i" + i);
                    //x축
                    GL.Vertex3(-rectSize, offsetY, -rectSize + i);
                    GL.Vertex3(rectSize, offsetY, -rectSize + i);

                    //z축
                    GL.Vertex3(-rectSize + i, offsetY, -rectSize);
                    GL.Vertex3(-rectSize + i, offsetY, rectSize);

                    //- 반대편 z축
                    GL.Vertex3(i, offsetY, -rectSize);
                    GL.Vertex3(i, offsetY, rectSize);
                    //- 반대편 x축
                    GL.Vertex3(-rectSize, offsetY, i);
                    GL.Vertex3(rectSize, offsetY, i);
                }
            }

            count++;
        }

        GL.End();
        yield return new WaitForEndOfFrame();
    }

    public void func_DrawLevel(float level, Color color,float offset)
    {
        //Debug.Log("Draw_Action");
        lineMaterial.SetPass(0);
        GL.Begin(GL.LINES);
        GL.Color(color);

        //startX = -rectSize;
        //startZ = -rectSize;
     
        int count= 0;
     


        for (float i = 0; i <= rectSize; i += level)
        {
            if (offset == 0)
            {
                //level1
                if (count % 5 == 0)
                {
                    //x축
                    GL.Vertex3(-rectSize, offsetY, -rectSize + i);
                    GL.Vertex3(rectSize, offsetY, -rectSize + i);

                    //z축
                    GL.Vertex3(-rectSize + i, offsetY, -rectSize);
                    GL.Vertex3(-rectSize + i, offsetY, rectSize);

                    //- 반대편 x축
                    GL.Vertex3(-rectSize, offsetY, i);
                    GL.Vertex3(rectSize, offsetY, i);

                    //- 반대편 z축
                    GL.Vertex3(i, offsetY, -rectSize);
                    GL.Vertex3(i, offsetY, rectSize);

                }
            }
            else if (count % offset != 0)
            {
                //level2,3,4
                if (i != rectSize)
                {
                    //Debug.Log("i" + i);
                    //x축
                    GL.Vertex3(-rectSize, offsetY, -rectSize + i);
                    GL.Vertex3(rectSize, offsetY, -rectSize + i);

                    //z축
                    GL.Vertex3(-rectSize + i, offsetY, -rectSize);
                    GL.Vertex3(-rectSize + i, offsetY, rectSize);

                    //- 반대편 z축
                    GL.Vertex3(i, offsetY, -rectSize);
                    GL.Vertex3(i, offsetY, rectSize);
                    //- 반대편 x축
                    GL.Vertex3(-rectSize, offsetY, i);
                    GL.Vertex3(rectSize, offsetY, i);
                }
            }

            count++;
        }
     
        GL.End();
     

    }

    private void OnPreRender()
    {
        //if (isLevel1)
        //{
        //    func_DrawLevel(level1_Step, Color_level1, 0);
        //}

        //if (isLevel2)
        //{
        //    func_DrawLevel(level2_Step, Color_level2, 10);
         
        //}

        //if (isLevel3)
        //{
        //    func_DrawLevel(level3_Step, Color_level3, 10);
         
        //}

        //if (isLevel4)
        //{
        //    func_DrawLevel(level4_Step, Color_level4, 10);
        //}
    }

    void OnPostRender()
    {
        if (isLevel1)
        {
            func_DrawLevel(level1_Step, Color_level1, 0);
        }

        if (isLevel2)
        {
            func_DrawLevel(level2_Step, Color_level2, 10);

        }

        if (isLevel3)
        {
            func_DrawLevel(level3_Step, Color_level3, 10);

        }

        if (isLevel4)
        {
            func_DrawLevel(level4_Step, Color_level4, 10);

        }


        //if (isLevel1)
        //{
        //    //func_DrawLevel(level1_Step, Color_level1, 0);

        //    StartCoroutine(draw_Line(level1_Step, Color_level1, 0));
        //}

        //if (isLevel2)
        //{
        //    //func_DrawLevel(level2_Step, Color_level2, 10);
        //    StartCoroutine(draw_Line(level2_Step, Color_level2, 10));
        //}

        //if (isLevel3)
        //{
        //    //func_DrawLevel(level3_Step, Color_level3, 10);
        //    StartCoroutine(draw_Line(level3_Step, Color_level3, 10));
        //}

        //if (isLevel4)
        //{
        //    //func_DrawLevel(level4_Step, Color_level4, 10);
        //    StartCoroutine(draw_Line(level4_Step, Color_level4, 10));
        //}

    }
}

EventArgs

public class EventRename : EventArgs, ICommand
{
    public GameObject item;
    public VirtualizingTreeViewDemo demo;
    public string OldString;
    public string NewString;

    public EventRename()
    {
        UndoRedoManager.Insert(this);
    }

    void ICommand.Execute()
    {
        demo.OnRename(null, this, NewString);
    }

    void ICommand.UnExecute()
    {
        demo.OnRename(null, this, OldString);
    }
}


public void SetRenameEvent(string newString)
    {
        GameObject selected = TreeView.SelectedItem as GameObject;
        var e = new EventRename() { item = selected, demo = this, NewString = newString, OldString = selected.name };
        OnRename(this, e, newString);
    }

    public void OnRename(object sender, EventRename e, string rename)
    {
        e.item.name = rename;
        TreeView.GetItemContainer(e.item).GetComponentInChildren<Text>(true).text = rename;
    }

다양하게 사용해보기~

2020년 5월 22일 금요일

[코딩테스트] 프린트

[코딩테스트] 스킬트리



문제 설명
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 CBD로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예
skillskill_treesreturn
"CBD"["BACDE", "CBADF", "AECB", "BDA"]2
입출력 예 설명
  • BACDE: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • CBADF: 가능한 스킬트리입니다.
  • AECB: 가능한 스킬트리입니다.
  • BDA: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

  1. 스킬 트리: 유저가 스킬을 배울 순서 


정답 및 해설

https://gist.github.com/DongguemYoo/95b7cf630819aed66c08aed66bc42279


2020년 5월 21일 목요일

[코딩테스트] 동물 수 구하기

문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE
동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A399552Dog2013-10-14 15:38:00NormalJackNeutered Male
A379998Dog2013-10-23 11:42:00NormalDiscipleIntact Male
A370852Dog2013-11-03 15:04:00NormalKatieSpayed Female
A403564Dog2013-11-18 17:03:00NormalAnnaSpayed Female
동물 보호소에 들어온 동물은 4마리입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
count
4
※ 컬럼 이름(위 예제에서는 count)은 일치하지 않아도 됩니다.




정답 및 풀이

-- 코드를 입력하세요
SELECT count(*) as count
from ANIMAL_INS 

[코딩테스트] 최댓값 구하기(mysql)


문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE
가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A399552Dog2013-10-14 15:38:00NormalJackNeutered Male
A379998Dog2013-10-23 11:42:00NormalDiscipleIntact Male
A370852Dog2013-11-03 15:04:00NormalKatieSpayed Female
A403564Dog2013-11-18 17:03:00NormalAnnaSpayed Female
가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
시간
2013-11-18 17:03:00

정답 및 풀이


-- 코드를 입력하세요
SELECT DATETIME as 시간
from ANIMAL_INS
order by DateTime desc limit 1


[코딩테스트] 상위 n 개 레코드


문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE
동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A399552Dog2013-10-14 15:38:00NormalJackNeutered Male
A379998Dog2013-10-23 11:42:00NormalDiscipleIntact Male
A370852Dog2013-11-03 15:04:00NormalKatieSpayed Female
A403564Dog2013-11-18 17:03:00NormalAnnaSpayed Female
이 중 가장 보호소에 먼저 들어온 동물은 Jack입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
NAME
Jack
※ 보호소에 가장 먼저 들어온 동물은 한 마리인 경우만 테스트 케이스로 주어집니다.



정답 및 풀이


mysql은 top이 없다

-- 코드를 입력하세요
SELECT NAME
from ANIMAL_INS
order by DATETIME asc LIMIT 1



git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...