2020년 8월 25일 화요일

[Python] Error Non-UTF-8 code starting with '\xeb',해결방법

해당 에러가 발생하면 

밑에 코드를 위에 적어주면 된다
#!/usr/bin/python
# -*- coding: utf-8 -*-

2020년 8월 22일 토요일

[Unity] Interface, 유니티 인터페이스 사용예제


인터페이스를 사용하면 이런 코드를

public class Bullet : MonoBehaviour{

    private void OnTriggerEnter2D(Collider2D collider)
    {
        Enemy enemy = collider.GetComponent<Enemy>();
        if(enemy != null)
        {
            //Hit a Enemy
            enemy.Damage();            
        }

        Crate crate = collider.GetComponent<Crate>();
        if(crate != null)
        {
            //Hit a Crate
            crate.Damage();            
        }

    }

}

매우간단하게 이런식으로

public Interface IDamageable{

    void Damage();
}

인터페이스를 추가하고


public class Enemy : MonoBehaviour , IDamageable{

    public void Damage();
}

public class Crate : MonoBehaviour , IDamageable{

    public void Damage();
}



이런식으로 변경할수있다.

public class Bullet : MonoBehaviour{

    private void OnTriggerEnter2D(Collider2D collider)
    {
       IDamageable damageable = collider.GetComponent<IDamageable>();

        if(damageable != null)
        {
            //Hit a Damageable Object
            damageable.Damage();
        }
    }

} 


원하는 어떤객체든지 IDamageable을 상속시키면 모두 사용가능하다




2020년 8월 20일 목요일

unity 프로젝트 깃 저장시 팁

 


일단 깃 저장소를 만든뒤

.gitignore 파일을 저장소에 등록하고

Assets

Packages

ProjectSettings

만 저장한다


[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
Assets/AssetStoreTools*

# Visual Studio cache directory
.vs/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.opendb

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

[Unity] XML 저장,C# XML 파일 체크

 


간단한 저장...


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

public class XmlManager : MonoBehaviour
{
    /// <summary>
    /// 생활용품 리스트
    /// </summary>
    public List<GameObjectgameObjects;
    string _filePath;

    public Transform ContentsParent;
    public GameObject Prefab;

    private void Awake()
    {
        _filePath = Application.dataPath + "/Resources/XML/LifeItems.XML";

    }

    public void SaveInfo()
    {
        try
        {
            ///파일이 있는지 없는지 확인하는 로직은 만들어야함 일단은 진행하도록함if()

            XmlDocument document = new XmlDocument();
            XmlElement FList = document.CreateElement("LifeItems");

            foreach (var obj in gameObjects)
            {
                XmlElement objElement = document.CreateElement("item: " + obj.name);
                objElement.SetAttribute("Type""생활용품");
                objElement.SetAttribute("이름"obj.name);
                objElement.SetAttribute("유통기한"obj.transform.position.ToString());
                FList.AppendChild(objElement);
            }

            document.Save(_filePath);

        }
        catch (System.Exception e)
        {
            Debug.Log("Error:" + e.ToString());

        }
    }

    public void LoadInfo()
    {
        try
        {
            XmlDocument document = new XmlDocument();
            document.Load(_filePath);
            XmlElement LifeItemList = document["LifeItems"];

            GameObject targetObj;

            foreach (XmlElement item in LifeItemList.ChildNodes)
            {
                GameObject lifeItem = Instantiate(PrefabContentsParent);
                lifeItem.name = item.GetAttribute("이름");
            }

        }
        catch (System.Exception e)
        {
            Debug.Log("Error:" + e.ToString());
        }
    }
}

###################################
//파일정보 있는지 확인하여 새로운파일 만드는것
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.IO;

public class XmlManager : MonoBehaviour
{
    /// <summary>
    /// 생활용품 리스트
    /// </summary>
    public List<LifeItemm_LifeItems;
    string _filePath;
    public LifeItemTableViewController m_LifeItemTableViewController;

    public Transform ContentsParent;
    public GameObject Prefab;

    private void Awake()
    {
        m_LifeItems = new List<LifeItem>();
        _filePath = Application.dataPath + "/Resources/XML/LifeItems.XML";
        Debug.Log("_filePath"_filePath);
        m_LifeItemTableViewController = FindObjectOfType<LifeItemTableViewController>();
        Prefab = FindObjectOfType<LifeItemTableViewCell>().gameObject;
    }

    private void Update()
    {
        if (Input.GetKeyDown("1"))
        {
            AddLifeItem();
        }
        if (Input.GetKeyDown("2"))
        {
            LoadInfo();
        }
    }

    public void AddLifeItem()
    {
        LifeItem item = new LifeItem("칫솔""생활용품""20200820"System.DateTime.Now.ToString());
        m_LifeItems.Add(item);
        m_LifeItemTableViewController.AddData(item);
        m_LifeItemTableViewController.ItemUpdate();
        SaveInfo();
    }


    public void SaveInfo()
    {
        
        try
        {
            ///파일이 있는지 없는지 확인하는 로직은 만들어야함 일단은 진행하도록함if()

            FileInfo fileInfo = new FileInfo(_filePath);

            if (fileInfo.Exists)
            {
                ///파일이 존재한다면
                XmlDocument document = new XmlDocument();
                document.Load(_filePath);
                XmlElement FList = document["LifeItems"];
                foreach (var obj in m_LifeItems)
                {
                    XmlElement objElement = document.CreateElement("물건정보");
                    objElement.SetAttribute("이름"obj.name);
                    objElement.SetAttribute("타입"obj.type);
                    objElement.SetAttribute("유통기한시작"obj.startDate);
                    objElement.SetAttribute("유통기한끝"obj.endDate);
                    objElement.SetAttribute("유통기한"obj.startDate + "~" + obj.endDate);
                    FList.AppendChild(objElement);
                }

                document.Save(_filePath);
            }
            else
            {
                ///파일이 존재하지않는다면
                XmlDocument document = new XmlDocument();
                XmlElement FList = document.CreateElement("LifeItems");
                document.AppendChild(FList);

                foreach (var obj in m_LifeItems)
                {
                    XmlElement objElement = document.CreateElement("물건정보");
                    objElement.SetAttribute("이름"obj.name);
                    objElement.SetAttribute("타입"obj.type);
                    objElement.SetAttribute("유통기한시작"obj.startDate);
                    objElement.SetAttribute("유통기한끝"obj.endDate);
                    objElement.SetAttribute("유통기한"obj.startDate + "~" + obj.endDate);
                    FList.AppendChild(objElement);
                }

                document.Save(_filePath);
            }

           

        }
        catch (System.Exception e)
        {
            Debug.Log("Error:" + e.ToString());

        }
    }

    public void LoadInfo()
    {
        try
        {
            XmlDocument document = new XmlDocument();
            document.Load(_filePath);
            XmlElement LifeItemList = document["LifeItems"];
            m_LifeItems = new List<LifeItem>();
            GameObject targetObj;

            foreach (XmlElement item in LifeItemList.ChildNodes)
            {
                LifeItem Li = new LifeItem(item.GetAttribute("이름"), item.GetAttribute("타입"), item.GetAttribute("유통기한시작"), item.GetAttribute("유통기한끝"));
                m_LifeItems.Add(Li);
                m_LifeItemTableViewController.AddData(Li);
            }
            m_LifeItemTableViewController.ItemUpdate();

        }
        catch (System.Exception e)
        {
            Debug.Log("Error:" + e.ToString());
        }
    }
}

2020년 8월 19일 수요일

[Unity] UI animation (Feat. Platinio Tween ), UI 효과 주기

 무료에셋 중에


Platinio Tween라는 앱이 있는데 상당히 사용하기 쉽고 좋다


간단하게 2가지 사용할만한게 있는데

Platinio.Popup은 Ui에 바로 붙여서 효과를 적용할수있다


간단하게 커스텀한 코드

using UnityEngine;
using Platinio.TweenEngine;
using Platinio.UI;

namespace Platinio
{
    public class Popup : MonoBehaviour
    {
        [SerializeFieldprivate Vector2 startPosition = Vector2.zero;
        [SerializeFieldprivate Vector2 desirePosition = Vector2.zero;
        [SerializeFieldprivate RectTransform canvas = null;      
        [SerializeFieldprivate float time = 0.5f;
        [SerializeFieldprivate Ease enterEase = Ease.EaseInOutExpo;
        [SerializeFieldprivate Ease exitEase = Ease.EaseInOutExpo;

        private bool isVisible    = false;
        private bool isBusy       = false;       
        private RectTransform thisRect = null;

        private void Start()
        {
            thisRect = GetComponent<RectTransform>();   
            
            thisRect.anchoredPosition = thisRect.FromAbsolutePositionToAnchoredPosition(startPosition , canvas);
        }

        public void Show()
        {
            thisRect.MoveUIdesirePositioncanvastime).SetEase(enterEase).SetOnComplete(delegate
            {
                isBusy = false;
                isVisible = true;
            });
            
        }

        ///좌우로 움직이게 만들기위해 커스텀한 코드
        public void MoveSide(Vector2 targetPosition)
        {
            thisRect.MoveUI(targetPositioncanvastime).SetEase(enterEase).SetOnComplete(delegate
            {
                isBusy = false;
                isVisible = true;
            });
        }
        ///좌우로 움직이게 만들기위해 커스텀한 코드

        public void Hide()
        {
            thisRect.MoveUIstartPositioncanvastime).SetEase(exitEase).SetOnComplete(delegate
            {
                isBusy = false;
                isVisible = false;
            });
        }

        public void Toggle()
        {
            if (isBusy)
                return;

            isBusy = true;

            if (isVisible)
                Hide();
            else
                Show();
        }
    }

}




PopUp이 달린 객체들을 왼쪽 오른쪽으로 움직여주는 함수


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

public class SceneChange : MonoBehaviour
{

    public Popup[] Popups;
    public Vector2 CenterPos;
    public Vector2 LeftPos;
    public Vector2 RightPos;
    public int currentIdx;
    public int max;
    // Start is called before the first frame update
    void Start()
    {
        max = Popups.Length;
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown("1"))
        {
            Next();
        }

        if (Input.GetKeyDown("2"))
        {
            Prev();
        }
    }

    public void Next()
    {
        if (currentIdx+1 > max)
            return;

        Popups[currentIdx].MoveSide(LeftPos);
        Popups[++currentIdx].MoveSide(CenterPos);

    }
    public void Prev()
    {
        if (currentIdx - 1 < 0)
            return;

        Popups[currentIdx].MoveSide(RightPos);
        Popups[--currentIdx].MoveSide(CenterPos);
    }
}



git rejected error(feat. cherry-pick)

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