728x90

 

 

아래 코드를 사용하면 된다.

Application.systemLanguage;

 

 

이걸 찍어보면 난 한국에 있기 때문에 Korean 으로 나온다.

다른 나라 이름은 아래 링크에 정리에 되어 있다.

 

https://docs.unity3d.com/ScriptReference/SystemLanguage.html

 

 

 



"초동수사 - 증언/증거 추리게임"

증거와 진술로 추리해야 하는 게임!

방탈출 게임이 아닙니다.

증거는 모두 찾았고 용의자들에게 증언을 얻어내세요!

 

 

 

[Android]

https://play.google.com/store/apps/details?id=com.loomiloomi.crimescene

 

[IOS]

https://apps.apple.com/kr/app/%EC%B4%88%EB%8F%99%EC%88%98%EC%82%AC-%EC%A6%9D%EC%96%B8-%EC%A6%9D%EA%B1%B0-%EC%B6%94%EB%A6%AC%EA%B2%8C%EC%9E%84/id6499072416

 

‎초동수사 - 증언/증거 추리게임

‎자택에서 친구들과 놀던 평범한 여대생 "나 미녀"가 갑작스럽게 사망했다. 그런데, 주변 사람들의 대화 내용이 심상치 않다!? ======== 안 남찬: "아니요! 저희는 밥을 먹고 있었을 뿐입니다! 힘들

apps.apple.com

 

 

728x90

 

 

두번째 사람부터 방을 못들어가면서 이런 에러가 나왔다.

보면 SQL logic error no such column: XXX 라고 되어 있다는 건, 컬럼 XXX가 없단다.

// 실제 방 생성  
void CreateRoom()  
{  
RoomOptions roomOptions = new RoomOptions();  
roomOptions.MaxPlayers = (byte)desiredMaxPeople; // 방 최대 인원 설정

    // 방의 사용자 정의 속성 설정
    Hashtable customProperties = new Hashtable
    {
        { "AA", "A값" },
        { "BB", "B값" },
        { "CC", "C값" }
    };

    roomOptions.CustomRoomProperties = customProperties;
    roomOptions.CustomRoomPropertiesForLobby = new string[] { "AA", "BB", "CC" };

    // 방 생성 시 올바른 로비 타입과 설정 사용
    PhotonNetwork.CreateRoom(null, roomOptions, selectLobby); // SQL 로비에서 방 생성
    Debug.Log("새로운 방을 생성했습니다.");
}

 

대강 이런식으로 방을 생성한다고 쳤을때, 내가 임의로 적어 넣은 컬럼명 AA, BB, CC가 문제였던 것이다.
C0, C1, C2이런식으로 해야 한단다.
문서에 써있다.

그럼 빠이

728x90



 

원하는 거: 그냥 단순히.. 슬라이더를 원형으로 하고 싶었고 핸들을 잡고 직접 돌리고 싶다.

아래 사진 참고.

 

검은 점을 잡고 돌리는 슬라이더

 

내가 원하는 건 위 사진의 검은 점을 잡고 원형으로 돌렸을때, 그 위치를 따라오면서 원의 값이 바뀌었으면 했다.

원리를 쉽게 말하자면 아래 사진을 보면 된다.

내 마우스의 위치가 A에 있을때 B에 해당하는 위치에 슬라이더 값이 있어야 한다는 뜻이다.

 

슬라이더 핸들이 드래그 중인 마우스의 위치와 직선상에 있어야 한다는게 포인트.

 

 

 

소스를 바로 봐 보자.

Canvas의 Render Mode가 Camera인 경우

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class CircularSlider : MonoBehaviour, IDragHandler, IPointerDownHandler
{
    public RectTransform handle; // 핸들 오브젝트
    public RectTransform centerPoint; // 중심점 오브젝트(따로 깡통 오브젝트 만들기)
    public Canvas canvas; // 현재 사용 중인 캔버스
    public Text valueText; // 값을 표시할 텍스트
    public Image fillImage; // 모드가 Radial 360 fill인 이미지

    public int maxChips = 280; // 최대 값 (100%에 해당)
    private float radius; // 중심점과 핸들 사이의 고정된 거리 (반지름)
    private float maxAngle = 260f; // 최대 각도 (260도)
    private float currentAngle = 0f; // 현재 핸들의 각도

    void Start()
    {
        // 중심점과 핸들 사이의 초기 거리(반지름)를 계산
        radius = Vector2.Distance(handle.anchoredPosition, centerPoint.anchoredPosition);
        UpdateHandlePosition(maxAngle); // 초기 위치를 0%로 설정
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        UpdateHandlePosition(eventData);
    }

    public void OnDrag(PointerEventData eventData)
    {
        UpdateHandlePosition(eventData);
    }

    private void UpdateHandlePosition(PointerEventData eventData)
    {
        // 마우스의 화면 좌표를 캔버스의 로컬 좌표로 변환
        Vector2 localMousePosition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(centerPoint, eventData.position, canvas.worldCamera, out localMousePosition);

        // 중심점에서 마우스 위치 사이의 벡터를 계산
        Vector2 direction = (localMousePosition - (Vector2)centerPoint.anchoredPosition).normalized;

        // 마우스 위치로부터 각도 계산 (0~360도)
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        if (angle < 0) angle += 360; // 각도를 0~360도로 조정

        // 시계방향으로 돌 때 각도 제한
        if (angle > maxAngle)
        {
            currentAngle = maxAngle; // 시계방향으로 최대값을 넘어가면 멈춤
        }
        else
        {
            currentAngle = Mathf.Clamp(angle, 0, maxAngle);
            // 핸들의 새로운 위치 계산: 중심점에서 방향 벡터에 반지름을 곱한 거리만큼 이동
            Vector2 newPosition = (Vector2)centerPoint.anchoredPosition + new Vector2(Mathf.Cos(currentAngle * Mathf.Deg2Rad), Mathf.Sin(currentAngle * Mathf.Deg2Rad)) * radius;

            // 핸들의 위치를 업데이트
            handle.anchoredPosition = newPosition;

            // 현재 값 및 이미지 업데이트
            UpdateValueText();
            UpdateFillImage();
        }

    }

    private void UpdateHandlePosition(float angle)
    {
        // 초기 위치 설정 함수
        currentAngle = angle;
        Vector2 newPosition = (Vector2)centerPoint.anchoredPosition + new Vector2(Mathf.Cos(currentAngle * Mathf.Deg2Rad), Mathf.Sin(currentAngle * Mathf.Deg2Rad)) * radius;
        handle.anchoredPosition = newPosition;
        UpdateValueText();
        UpdateFillImage();
    }

    private void UpdateValueText()
    {
        // 각도를 최대 칩 수로 변환하여 텍스트 업데이트
        // currentAngle이 최대일 때 0이 표시되도록 반대로 계산
int currentValue = Mathf.RoundToInt((1 - (currentAngle / maxAngle)) * maxChips);

        valueText.text = currentValue.ToString();
    }

    private void UpdateFillImage()
    {
        // 각도를 0에서 1 사이의 값으로 변환하여 Radial Fill에 적용
        // FillAmount는 핸들이 움직인 비율로 설정해야 합니다.
        fillImage.fillAmount = currentAngle / 360;
    }
}

 

 

 

주석을 친절히 써놨으니, 대강 알것이다...

 

 

 

결과물:

근데 지금 보니 내가 색상을 반대로 해놨네;; 숫자가 올라갈때 색상이 채워져야 하는데ㅇㅅㅇ ㅋㄷㅋㄷ

뭐 아무튼..

 

UI는 정말 딱 참고만 하시고...

내가 한 방법은.

두 개의 원 이미지를 만들고 레이어상 뒤에 원을 크게 만들어서 지금처럼 초록색을 넣고 모드를 radial 360 fill로 넣었다. 

핸들은 0이어야 하는 지점에 미리 가져다 놓았다.

728x90

 

 

 

 

 

 

 

안녕하세요.

 

추리게임 초동수사에 대해 의문점을 풀어드리는 글입니다.

이 부분은 좀 궁금했다. 하는 점을 남겨주시면 성심성의껏 이 게시글에 계속해서 추가하겠습니다.

 

 


 

 

스포주의!!

 

먼저 플레이 후 글을 읽어주세요~~

 

 

 

----

질문 출처: 구글플레이 리뷰

의아한 점:

미녀는 상당히 치밀하고 영악한 면이 있습니다. 목적을 달성하는 데에 필요한 것을 알아내고, 그것을 얻기 위해 무언가를 계획하고 또 그 계획을 실행하는 일을 지금까지 성공적으로 마쳐왔죠. 그런데 그런 미녀가 >자신이 김청소에게 약을 던지면 그 약이 결과적으로 담금주에 들어갈 것이다< 라는 다소 빈약한 필연성을 기반으로 사건을 계획한 것이 조금 납득하기 어려웠습니다. 어쩌면 제가 스토리를 오독한 것일지도 모르지만, 제 해석에 한해 느낀 아쉬운 점입니다. 너무 마음에 드는 게임이라 되려 아쉬운 점이 크게 느껴지는 것 같아요. 재미있었습니다!

 

 

답변:

오독은 아니고 아주 합리적인 생각입니다. 정말 꼼꼼히 플레이 해주셨군요.

"자신이 김청소에게 약을 던지면 그 약이 결과적으로 담금주에 들어갈 것이다"에서 나 미녀는 약 배달의 매개체가 "담금주"가 될지는 몰랐어도, 결국 약은 어딘가에 들어가 자신에게 되돌아 올 것이라는 것에 대해 확신했습니다.

왜냐하면, 나 미녀는 나 언니의 "인성"을 알고 있었기 때문입니다. 이 부분은 다소 추상적인 이유가 될 수 있는데요.

일단, 제가 생각한 나 미녀의 생각 흐름은.

 

1. 어떤 경로로든 나 언니에게 치욕스러움을 준다 - 나 언니가 무릎꿇고 반성문을 읽게하는 영상을 찍음

2. 나 언니라면 나 미녀에게 앙갚음을 할 것이다 - 나 언니의 인성 박살은 곳곳에서 나옵니다.

3. 나 언니에게 트리거를 준다 - "이걸 먹으면 나 미녀가 아프다"

 

나 미녀의 이런 생각으로 분명 자신에게 약이 돌아 올 것이라고 확신했습니다. 나 미녀나 우리 입장에서 그건 독약이지만, 나 언니에게 그 약은 그냥 먹으면 배가 좀 아픈 진통제였거든요. 여태까지의 인성을 보자면 약을 안타는게 더 이상하게 끔 설계를 해놨습니다만.. 설득이 안된다면 그건 캐릭터 설정 실패겠죠...ㅠ...큽...

-> 또한, 바닥에 떨어진 약을 나 언니가 안가져갔다면, 나 미녀가 회수 했을것 같네요.

 

하지만, 나 미녀도 언제? 라는 것 까지는 100%조절할 수는 없었는데요. 나 미녀는 확률을 높일 수 있는 방법을 선택해야 했습니다.

3월5일 새벽에 치욕을 안겨주고, 당일 저녁 친구들과 술파티를 한다. 무방비한 상태에서 나 언니의 복수를 기다린다.

 

아마 이 부분에서 너무 안일한 장치가 아닌가? 하는 의문이 들었을 것 같아요. 제가 봐도 그러니까요.

하지만, 나 미녀에게 '필연'은 필요가 없었습니다.

그 날이 아니면, 다음에 또 하면 되거든요. 다만, 아쉬웠을 뿐일 거에요. 사실 그게 끝이었답니다.

-> 이게 성립하려면 약이 되돌아 올 것이라는 걸 확신을 줘야 하는데, 위에서 말했듯 아마 그부분을 좀 더 보강을 못했던 것은 아닐까 생각이 듭니다.

아무튼, 만약 그 날이 3월 5일이 아닌 다른 날이 되었다면, 그 날이 추리게임에 등장을 했을거에요.

-> 이 부분을 지금 작성하면서 생각해 보자면, 그 전에 실패를 한 전적을 보여줬더라면, 더 설득력이 있었을 것같네요! 참고해야겠어요.

 

조금은 설득이 되었을까요? 아무래도 말씀하신 부분은 구체적인 증거를 기반한 추리라기 보다는 심리추리를 해야 했던 부분이라... 누군가는 납득을 할 수 있어도 누군가는 납득 할 수 없는 이유로 보일 것 같아요. 현생을 살아갈때도 똑같은 말을해도, 모두가 다르게 받아들이니까요. 그건 어쩔 수 없는 일이라고 생각하고, 감수하고 만든거랍니다.

그러니 그 부분에 의문을 가진 것은 너무나도 합리적인 생각이고, 꼼꼼히 플레이했다는 증거지요.

 

제가 질문을 잘못 이해하고 다른 답변 단거라면 댓글 부탁드립니다.

-> 리뷰를 읽으니 수다의 욕구가 치밀어 올라서 이야기가 샜을 것같아서요 ㅠ

그리고 애정어린 리뷰 정말 감사드립니다.

(이 글을 읽으실지는 몰겠지만... ps. 근데 글을 왤케 잘쓰세요.)

 

 

----------------------------------------

 

 

 

출처: 앱스토어

질문: 초콜릿은 어디서 얻을 수 있나요?

 

답변: 안녕하세요. 초콜릿을 찾고계시다는 건 이미 다른 추리가 다 끝났다고 봐도 무방하겠네요! 초콜릿은 아주아주 중요한 핵심 증거물이랍니다. 답변을 드리자면 초콜릿은 "과자" 증거물에서 김 청소에게 여러번 재질문을 하게 되면 해금되는 증거물입니다.

그런데 질문에 답변을 하려고 확인을 하던 중에 제 실수가 있는 걸 발견했습니다.. 초콜릿 이름은 "골드 기니 초콜릿"입니다. "과자" 증거물의 영수증과 "신문" 증거물에 적혀있는 것 모두 "골드 기니 초콜릿"입니다..만 다르게 적혀있네요,. 이런 대형 사고를 치다니ㅠㅠ 이래서 나이들면 밤새면 안되는디...

혹시 이것 때문에 헷갈려서 못찾으신거라면 죄송합니다 ㅠㅠ 큽 ㅠㅠ 

빠른 시일내에 수정해서 올리겠습니다. 덕분에 찾았어요. 감사합니다!

 

 

 

 

728x90

 

Assets/Plugins/Android/gradleTemplate.properties

에다가

android.enableR8 = true

를 넣어준다.

 

만약 gradleTemplate.properties파일이 없다면.

 

project setting > Player > Publishing Settings > Build > Custom Gradle Properties Template에 체크한다.

그럼 로딩되다가 파일이 생긴다.

 

 

여기 빨간 상자에 체크

 

 

 

아래는 내 gradleTemplate.properties파일 코드.

org.gradle.jvmargs=-Xmx4096m
org.gradle.parallel=true

unityStreamingAssets=your_streaming_assets_path_here
# Android Resolver Properties Start
android.useAndroidX=true
android.enableJetifier=true
# Android Resolver Properties End

additional_properties_here
android.enableR8=true

 

 

 

 

 

 

 

 

728x90

 

 

빌드시 이런 에러가 나오면 중복된 Class가 있다는 것이다.

 

 

 

해결방법:

 

1. 프로젝트 영역에서 " 2"를 검색해보자. 그냥 2가 아니고 "띄어쓰기2"

 

2. 그럼 파일이름 끝에 " 2"가 있는게 있을 것이다.

예) AndroidManifest 2.xml
이런식으로.

 

3. 그걸 지운다. 

 

4. 그럼 다시 빌드를 하여, 또 다른 빌드에러를 맛보러 간다.

 

728x90

 

 

"탐독: 문장 추리게임 & 워드퍼즐" 게임을 출시했다.

 

문장 추리게임이라고 써놓긴했지만, 추리라기 보단... 문맥 파악..?

 

유명 고전 소설을 읽으면서 문장 빈칸을 맞추는 게임이다.

 

 

 

이건 보통 난이도 일때!. 

빈칸은 랜덤으로 나오긴하지만, 연속적이면 조금 더 어려워진다.

하지만, 문맥과 글자 길이를 보면 왠지... 알 것 같기도!?

 

그리고 글을 읽을 수 밖에 없는 구조라서 책을 읽고 싶어하는 사람들에게 짬짬이 글도 읽게 해주는 게임이 되는 것이다~~~~~!!!

난 재밌는데...! 정말 재밌는데!!!

 

많관부~~

 

 

 

 

 

 

 

https://apps.apple.com/kr/app/%ED%83%90%EB%8F%85-%EB%AC%B8%EC%9E%A5-%EC%B6%94%EB%A6%AC%EA%B2%8C%EC%9E%84-%EC%9B%8C%EB%93%9C%ED%8D%BC%EC%A6%90/id6581486012

 

‎탐독: 문장 추리게임 & 워드퍼즐

‎耽(즐길 탐), 讀(읽을 독) - 책 좀 읽어야 하는데...라는 마음속 부채감이 있진 않았나요? - 긴 소설을 짧은 문단으로 짬짬이 읽어가며 즐길 수 있는 게임입니다. -------------------------------------------

apps.apple.com

 

728x90

 

 

문제 : 자식 아래에 클릭이벤트가 있는 부모가 있는 상태에서 자식을 눌렀을 경우에 부모가 클릭된다.

회색이 부모고, 흰박스가 자식이라 했을때.

 

목표 : Raycast Target 기능을 사용하지 않고, 자식을 눌렀을 때 반응이 없어야 한다

해결 : Raycast Target의 값을 수정하지 않아야 하는 경우. 꼼수지만... 흰박스에 버튼 공갈 컴포넌트를 넣으면된다. Transition은 None으로 주고.

걍 이렇게.

 

 

나야 뭐 정석적으로 하는 사람도 아니고... 나느 이런 경우는 많지 않아서 그냥 이렇게 쓴다.!

+ Recent posts