문제점: 한 글자씩 타이핑 줄때 <color~ 같은 태그가 유저에게 보인다. </color> 까지 닫아줘야 색상이 지정된다. 해결: 임시 제어문자를 넣어준다.
string testStr = "안녕하세요. r거두절meb입니다.";
public IEnumerator ShowText(string fullText, Text txtCompo)
{
string displayText = ""; // 표시할 최종 문자열
string color = "black"; // 기본 색상
for (int i = 0; i < fullText.Length; i++)
{
if(fullText[i] == 'r'){
color = "red"; // 빨간색 설정
continue;
} else if(fullText[i] == 'b'){
color = "black"; // 검정색 설정
continue;
}
// 현재 문자에 적절한 색상 적용
displayText += $"<color={color}>{fullText[i]}</color>";
txtCompo.text = displayText;
yield return new WaitForSeconds(0.1f);
}
juniorScriptCoroutine = null;
}
사용법: r, b는 내가 넣은 임시 문자고 필요에 따라 다른걸 넣어주면 된다. r뒤부터는 빨간색이 나오고, b뒤부터는 검정색이 나올 수 있도록했다. r, b 차례일때는 다음 폰트의 color만 바꿔주는 역할만 하고 텍스트에 들어가지 않도록 continue를 해준다.
내게 필요했던 점: 데이터를 저장할 곳, DATA CRUD + 개발 중 손쉽게 수정이 가능하게. 해결 방법: Json텍스트저장, scriptableObject, simpleSQL 등. 그 중 데이터를 쉽게 넣고 한 눈에 보기 쉬운 SimpleSQL을 선택했다.
< 준비물 > 1. 에셋스토어에서 구매를 하고 다운을 받아서 임포트를 한다.(Demo도 함께 인스톨) 2. DB Browser for SQL을 다운 받는다. https://sqlitebrowser.org/dl/
준비물만 있으면 끝이다. SimpleSQL > Demos > DataBases를 보면 데이터베이스가 있는 걸 볼 수 있다. CRUD는 데모에 있으니 쿼리를 잘 확인해 보면 될것이고... 내가 원하는건 대량으로 데이터를 넣는 것이다. 그렇기 때문에 코드로 하는게 아니고 db툴로 하고 싶었다. 초기데이터는 SimpleSQL > Demos > DataBases 여기에 있는 데이터가 초기 데이터라고 보면 된다. 게임을 최초로 시작하면 제공될 데이터.
아래 이미지를 보면 DbManager의 Simple Sql Manager스크립트에 Change Working Name이 SciFi.sqlite라고 되어 있다. 내가 테이블 데이터를 변경할때 저 이름의 db를 변경하겠다는 뜻이다.
이제 db툴을 이용하기 위해 저 SciFi.sqlite라는 db파일이 실제로 어디에 있는지 알아야 한다.
string dataPath = Application.persistentDataPath;
Debug.Log("Persistent Data Path: " + dataPath);
위 로그를 찍어보면 영구적으로 데이터를 저장할 수 있는 경로가 나온다. 게임을 지워야 사라지는 데이터다. 가보면
이 파일을 아까 다운 받았던, DB Browser for SQLite에 끌어다 넣는다.
그럼 위 처럼 나온다. 이미지 상단 탭의 데이터베이스 구조, 데이터 보기 등을 보면서 툴 구조를 살펴보고, 데이터를 만져보쟈!
방법 1. 유니티 AssetStore에서 LeanTween 다운 받고 import하기. 2. 소스짜기.
using UnityEngine;
using UnityEngine.UI;
public class SpreadObj : MonoBehaviour
{
public GameObject mainButton;
public GameObject[] subButtons;
private bool areSubButtonsVisible = false;
public void ToggleSubButtons()
{
areSubButtonsVisible = !areSubButtonsVisible;
if (areSubButtonsVisible)
{
// 서브 버튼을 보이게 하고 슬라이딩 효과로 배치
SetSubButtonsActive(true);
SlideSubButtons(); // 최종 위치 설정
}
else
{
SlideSubButtons(true);
// 서브 버튼을 숨기고 초기 위치로 순서대로 빨려들어가는 효과
}
}
void SetSubButtonsActive(bool isActive)
{
foreach (GameObject subButton in subButtons)
{
subButton.SetActive(isActive);
}
}
void SlideSubButtons(bool isReverse = false)
{
for (int i = 0; i < subButtons.Length; i++)
{
RectTransform rectTransform = subButtons[i].GetComponent<RectTransform>();
float mainBtnPosY = mainButton.GetComponent<RectTransform>().anchoredPosition.y;
if (isReverse)
{
LeanTween.moveLocalY(rectTransform.gameObject, mainBtnPosY, 0.3f)
.setEase(LeanTweenType.easeInBack);
}
else
{
float targetPosition = mainBtnPosY+((i+1)*150);
LeanTween.moveLocalY(rectTransform.gameObject, targetPosition, 0.3f)
.setEase(LeanTweenType.easeOutBack)
.setDelay(0.1f * i);
}
}
}
}
[System.Serializable] public class WeaponData { public string nameEN; public string nameKR; public string desc; // 설명 public StatData[] levelStat; public int level;