Get it on Google Play


Wm뮤 :: '분류 전체보기' 카테고리의 글 목록 (59 Page)

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


'전체보기'에 해당되는 글 1150건

  1. 2021.07.10 포톤 PUN -> PUN2 변경점
  2. 2021.07.10 포톤 보이스
  3. 2021.07.07 포톤 챗
  4. 2021.07.06 포톤 볼트
  5. 2021.07.04 포톤 커스텀 플레이어 만들기
  6. 2021.07.01 유니티 좌표계산 모음
  7. 2021.06.30 깃허브 이모티콘 사용법
  8. 2021.06.29 connect to github popup error
2021. 7. 10. 17:34 Unity/Photon

API들

 

https://doc-api.photonengine.com/en/pun/v2/index.html

 

Photon Unity Networking 2: Main Page

Introduction Photon is a real-time multiplayer game development framework that is fast, lean and flexible. Photon consists of a server and multiple client SDKs for major platforms. Photon Unity Network (PUN) is our is our take on a Unity specific, high-lev

doc-api.photonengine.com

 

 

 



추가해야할것들

 

using Photon.Pun;

 

변경되는 함수

public class PhotonInit : Photon.PunBehaviour 
-> 
public class PhotonInit : MonoBehaviourPunCallbacks 










PhotonNetwork.ConnectUsingSettings(serverName);
PhotonNetwork.ConnectToBestCloudServer(serverName);
->
PhotonNetwork.ConnectUsingSettings();
PhotonNetwork.ConnectToBestCloudServer();






public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)
{
}
    
    ->
public override void OnJoinRandomFailed(short returnCode, string message)
{
}
    
    
    
    
    
    
    
public override void OnPhotonCreateRoomFailed(object[] codeAndMsg)
{
}

->

public override void OnCreateRoomFailed(short returnCode, string message)
{
}





photonView.isMine

->

photonView.IsMine





PhotonTargets.All
->
RpcTarget.All





PhotonNetwork.PhotonServerSettings.ChatAppID
->
Photon.Pun.PhotonNetwork.PhotonServerSettings.AppSettings.AppIdChat





public override void OnReceivedRoomListUpdate()
{
    RoomInfo[] rooms = PhotonNetwork.GetRoomList();
}
->
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
}

 

 

 

삭제된 함수

    public override void OnConnectedToPhoton()
    {
    }

 

 

'Unity > Photon' 카테고리의 다른 글

자주 쓰는 유니티 포톤 코드  (0) 2021.07.26
포톤 보이스  (0) 2021.07.10
포톤 챗  (0) 2021.07.07
posted by 모카쨩
2021. 7. 10. 16:17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2021. 7. 7. 02:16 Unity/Photon

별도로 챗용 에셋을 다운받을 필요없이 PUN API에서도 동작한다

 

 

 

 

 

 

 

 

 

 

 

 

 

UI Text를 깔고 ContentSizeFitter를 넣는다

 

 

PUN코드

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Chat;
using ExitGames.Client.Photon;

public class PhotonChatTest : MonoBehaviour, IChatClientListener
{
    public string serverName = "Default0001";




    ChatClient chatClient;
    public string userName="TestName";

    List<string> messageList = new List<string>();
    readonly int messageFromHistory = 10;

    public Text currentChannelText;

    public void Connect()
    {

        chatClient = new ChatClient(this);


        chatClient.UseBackgroundWorkerForSending = true;
        chatClient.Connect(PhotonNetwork.PhotonServerSettings.ChatAppID, Application.version, new Photon.Chat.AuthenticationValues(userName));


        Debug.Log("Connect");


    }


    public void OnApplicationQuit()
    {
        chatClient.Disconnect();
    }

    public void AddLine(string message)
    {
        messageList.Add(message);

        if (messageList.Count> messageFromHistory)
        {
            messageList.RemoveAt(0);
        }
        currentChannelText.text = string.Join("\n", messageList);
    }


    public void DebugReturn(DebugLevel level, string message)
    {
        switch (level)
        {
            case DebugLevel.ERROR:
                Debug.LogError(message);
                break;
            case DebugLevel.WARNING:
                Debug.LogWarning(message);
                break;
            default:
                Debug.Log(message);
                break;
        }
    }


    public void OnConnected()
    {
        Debug.Log("OnConnected");

        chatClient.Subscribe(new string[] { serverName }, messageFromHistory);
    }

    public void OnDisconnected()
    {
        Debug.Log( "OnDisconnected");
    }


    public void OnChatStateChange(ChatState state)
    {
        Debug.Log($"OnChatStateChange {state}");
    }

    public void OnSubscribed(string[] channels, bool[] results)
    {
        Debug.Log( $"OnSubscribed : {string.Join(", ", channels)}");
    }

    public void OnUnsubscribed(string[] channels)
    {
        Debug.Log( $"OnUnsubscribed : {string.Join(", ", channels)}");
    }

    public void OnGetMessages(string channelName, string[] senders, object[] messages)
    {
        for (int i = 0; i < messages.Length; i++)
        {
            AddLine($"{senders[i]}:{ messages[i]}");
        }
    }


    void Start()
    {
        Application.runInBackground = true;
        if (Application.platform==RuntimePlatform.WindowsEditor)
        {
            userName += SystemInfo.deviceUniqueIdentifier.Substring(0,4);
        }
        Connect();
        currentChannelText.text = "";
    }
    void Update()
    {
        chatClient.Service();
    }

    public void SendChatMessage(string message)
    {
        if (string.IsNullOrWhiteSpace(message))
        {
            return;
        }
        message = message.Trim();
        chatClient.PublishMessage(serverName, message);
    }

    public void OnUserSubscribed(string channel, string user)
    {
        Debug.Log($"OnUserSubscribed :channel {channel},user {user}");
    }

    public void OnUserUnsubscribed(string channel, string user)
    {
        Debug.Log($"OnDisconnected :channel {channel},user {user}");
    }

    public void OnPrivateMessage(string sender, object message, string channelName)
    {
        Debug.Log($"OnDisconnected :sender {sender},message {message},channelName {channelName}");
    }

    public void OnStatusUpdate(string user, int status, bool gotMessage, object message)
    {
        Debug.Log($"OnDisconnected :user {user},status {status},gotMessage {gotMessage},message {message}");
    }

}

 

PUN2코드

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Chat;
using ExitGames.Client.Photon;

public class PhotonChatTest : MonoBehaviour, IChatClientListener
{
    public string serverName = "Default0001";




    ChatClient chatClient;
    public string userName="TestName";

    List<string> messageList = new List<string>();
    readonly int messagesFromHistory = 10;

    public Text currentChannelText;

    public void Connect()
    {

        chatClient = new ChatClient(this);


        chatClient.UseBackgroundWorkerForSending = true;
        chatClient.Connect(Photon.Pun.PhotonNetwork.PhotonServerSettings.AppSettings.AppIdChat, Application.version, new AuthenticationValues(userName));
        

        Debug.Log("Connect");


    }


    public void OnApplicationQuit()
    {
        chatClient.Disconnect();
    }

    public void AddLine(string message)
    {
        messageList.Add(message);

        if (messageList.Count> messagesFromHistory)
        {
            messageList.RemoveAt(0);
        }
        currentChannelText.text = string.Join("\n", messageList);
    }


    public void DebugReturn(DebugLevel level, string message)
    {
        switch (level)
        {
            case DebugLevel.ERROR:
                Debug.LogError(message);
                break;
            case DebugLevel.WARNING:
                Debug.LogWarning(message);
                break;
            default:
                Debug.Log(message);
                break;
        }
    }


    public void OnConnected()
    {
        Debug.Log("OnConnected");

        chatClient.Subscribe(new string[] { serverName }, messagesFromHistory);
    }

    public void OnDisconnected()
    {
        Debug.Log( "OnDisconnected");
    }


    public void OnChatStateChange(ChatState state)
    {
        Debug.Log($"OnChatStateChange {state}");
    }

    public void OnSubscribed(string[] channels, bool[] results)
    {
        Debug.Log( $"OnSubscribed : {string.Join(", ", channels)}");
    }

    public void OnUnsubscribed(string[] channels)
    {
        Debug.Log( $"OnUnsubscribed : {string.Join(", ", channels)}");
    }

    public void OnGetMessages(string channelName, string[] senders, object[] messages)
    {
        for (int i = 0; i < messages.Length; i++)
        {
            AddLine($"{senders[i]}:{ messages[i]}");
        }
    }


    void Start()
    {
        Application.runInBackground = true;
        if (Application.platform==RuntimePlatform.WindowsEditor)
        {
            userName += SystemInfo.deviceUniqueIdentifier.Substring(0,4);
        }
        Connect();
        currentChannelText.text = "";
    }
    void Update()
    {
        chatClient.Service();
    }

    public void SendChatMessage(string message)
    {
        if (string.IsNullOrWhiteSpace(message))
        {
            return;
        }
        message = message.Trim();
        chatClient.PublishMessage(serverName, message);
    }

    public void OnUserSubscribed(string channel, string user)
    {
        Debug.Log($"OnUserSubscribed :channel {channel},user {user}");
    }

    public void OnUserUnsubscribed(string channel, string user)
    {
        Debug.Log($"OnUserUnsubscribed :channel {channel},user {user}");
    }

    public void OnPrivateMessage(string sender, object message, string channelName)
    {
        Debug.Log($"OnPrivateMessage :sender {sender},message {message},channelName {channelName}");
    }

    public void OnStatusUpdate(string user, int status, bool gotMessage, object message)
    {
        Debug.Log($"OnStatusUpdate :user {user},status {status},gotMessage {gotMessage},message {message}");
    }

}

챗 관리 오브젝트를 만들어서 위 코드를 붙여넣고 아까만든 UI Text를 할당한다

 

 

 

InputField를 만들어서 다음과 같이 할당한다

 

 

 

 

 

 

 

 

 

작동중인모습

'Unity > Photon' 카테고리의 다른 글

포톤 보이스  (0) 2021.07.10
포톤 볼트  (0) 2021.07.06
포톤 커스텀 플레이어 만들기  (0) 2021.07.04
posted by 모카쨩
2021. 7. 6. 03:31 Unity/Photon

https://assetstore.unity.com/packages/tools/network/photon-bolt-free-127156

 

Photon Bolt FREE | 네트워크 | Unity Asset Store

Get the Photon Bolt FREE package from Exit Games and speed up your game development process. Find this & other 네트워크 options on the Unity Asset Store.

assetstore.unity.com

 

 

 

 

 

 

 

 

하다보니 이게 게임파일을 서버에 올리는 방식이라 좀 나중에 하기로 함

 

 

 

 

 

 

 

 

 

 

'Unity > Photon' 카테고리의 다른 글

포톤 챗  (0) 2021.07.07
포톤 커스텀 플레이어 만들기  (0) 2021.07.04
포톤 설치  (0) 2020.12.02
posted by 모카쨩
2021. 7. 4. 20:17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2021. 7. 1. 01:41 Unity/C#

 

각도계산

https://wmmu.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%B0%A9%ED%96%A5%EA%B4%80%EB%A0%A8-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC

 

결과값이 각도일 경우에는 위 링크로

결과값이 좌표일 경우에는 이 글을 이용

 

 

 

 

 

LenPos

각도를 좌표로

Quaternion direction;
Vecter3 distance;
LenPos = direction * Vector3.forward * distance

 

 

유니티판 PointDirection

2D 계산용

Debug.Log(Quaternion.Euler(0, 0, 0) * Vector2.right); //(1, 0, 0)
Debug.Log(Quaternion.Euler(0, 0, 90) * Vector2.right); //(0, 1, 0)
Debug.Log(Quaternion.Euler(0, 0, 180) * Vector2.right); //(-1, 0, 0)
Debug.Log(Quaternion.Euler(0, 0, 270) * Vector2.right); //(0, -1, 0)

 

 

 

ScreenToRectPosition

var canvas = GetComponentInParent<Canvas>();
Camera cam = null;
switch (canvas.renderMode)
{
    case RenderMode.ScreenSpaceOverlay:
        break;
    case RenderMode.ScreenSpaceCamera:
    case RenderMode.WorldSpace:
        cam = canvas.worldCamera;
        break;
    default:
        break;
}
if (cam == null)
{
    cam = Camera.main;
}



switch (canvas.renderMode)
{
    case RenderMode.ScreenSpaceOverlay:
        handle.transform.position = eventData.position;
        break;
    case RenderMode.ScreenSpaceCamera:
    case RenderMode.WorldSpace:
        Vector3 rectPos;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(GetComponent<RectTransform>(), eventData.position, cam, out rectPos);
        handle.transform.position = rectPos;
        break;
    default:
        break;
}

 

위에서 카메라만 가져올땐 약식으로 이거 써도 된다

public (Canvas, Camera) GetCanvasCamera()
{
    var canvas = GetComponentInParent<Canvas>();
    var camera = canvas.worldCamera;
    if (camera == null)
    {
        camera = Camera.main;
    }
    return (canvas,camera);

}

 

 

 

 

 

 

 

 

 

특정 각도를 upVector삼아서 회전

(노란색 : 회전시킨 벡터)

(빨간색 : 기준각도)

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




public class VectorRotationTest : MonoBehaviour
{
    void OnDrawGizmos()
    {
        //입력값
        var axis = new Vector3(-2.85f, 1.4f, 3.4f);
        var a = transform.rotation;
        var b = Quaternion.Euler( 0,  0, (Time.time * 30) % 360);



        //노란색원의 좌표계
        var radius = Vector2.Distance(Vector2.zero, new Vector2(axis.x, axis.y));
        var center = transform.position + a * Vector3.forward * axis.z;
        UnityEngine.Debug.DrawLine(center, center + a * Vector3.up * radius, Color.blue);
        UnityEngine.Debug.DrawLine(center, center + a * Vector3.right * radius, Color.green);

        //노란색원
        UnityEditor.Handles.color = Color.yellow;
        UnityEditor.Handles.DrawWireDisc(center, a * Vector3.forward, radius);
        UnityEditor.Handles.color = Color.white;


        //흰색원과 좌표계
        UnityEngine.Debug.DrawLine(transform.position, center, Color.red);
        UnityEngine.Debug.DrawLine(transform.position, transform.position + a * Vector3.up, Color.blue);
        UnityEngine.Debug.DrawLine(transform.position, transform.position + a * Vector3.right, Color.green);
        UnityEditor.Handles.DrawWireDisc(transform.position, a * Vector3.forward, 1f);

        var upRotation = a;

        //핵심
        UnityEngine.Debug.DrawLine(transform.position, transform.position + upRotation * b * axis, Color.yellow);

        //검은색 선
        UnityEngine.Debug.DrawLine(transform.position, transform.position + upRotation * b * Quaternion.Euler(0, 0, 90) * axis, Color.black);
        UnityEngine.Debug.DrawLine(transform.position, transform.position + upRotation * b * Quaternion.Euler(0, 0, 180) * axis, Color.black);
        UnityEngine.Debug.DrawLine(transform.position, transform.position + upRotation * b * Quaternion.Euler(0, 0, 270) * axis, Color.black);





    }
}

 

 

 

 

 

벡터를 6방향으로 정규화

var axisNormal=vector;
if (Mathf.Abs(axisNormal.x) > Mathf.Abs(axisNormal.y))
{
    axisNormal.y = 0;
}
if (Mathf.Abs(axisNormal.x) > Mathf.Abs(axisNormal.z))
{
    axisNormal.z = 0;
}
else
{
    axisNormal.x = 0;
}
axisNormal = axisNormal.normalized;

 

 

 

GPT가 짜준 패스에서 최단지점 구하는 함수

Vector3 ClosestPoint(Vector3 a, Vector3 b, Vector3 position)
{
    Vector3 ab = b - a;
    Vector3 ap = position - a;
    float t = Vector3.Dot(ap, ab) / Vector3.Dot(ab, ab);
    t = Mathf.Clamp01(t); // a와 b 사이의 지점만을 고려하려면 이 줄을 추가합니다.
    return a + ab * t;
}
Vector3 ClosestPoint(Vector3 position)
{
    var path = GetPath();
    float minDistance = float.MaxValue;
    Vector3 closestPoint = Vector3.zero;

    for (int i = 0; i < path.Count - 1; i++)
    {
        Vector3 point = ClosestPoint(path[i], path[i + 1], position);
        float distance = Vector3.Distance(point, position);

        if (distance < minDistance)
        {
            minDistance = distance;
            closestPoint = point;
        }
    }

    return closestPoint;
}

List<Vector3> GetPath()
{
    var childs = new List<Transform>();
    for (int i = 0; i < tracksParent.childCount; i++)
    {
        childs.Add(tracksParent.GetChild(i));
    }
    var path = childs.ConvertAll(x => x.position);

    return path;
}

 

 

상대좌표

그러니까 글로벌 좌표를 로컬 좌표로 바꿔준다

v1

더보기


스케일값은 계산되어있지 않다

var localPosition = Quaternion.Inverse(transform.rotation) * (globalPosition - transform.position);

 

 

역변환 포함

v2


var globalPosition = transform.TransformPoint(localPosition);
var localPosition = transform.InverseTransformPoint(globalPosition);



 

벡터를 특정 각도로 랜덤하게 회전

FPS 게임에서 총알 각도등을 계산할때 쓴다

기존에 내가 계산하던 방식

var vector = Camera.main.transform.forward;
var angle = 5f;
var randomAngle = Random.Range(0, angle);
var rotatedVector = Quaternion.LookRotation(vector, Vector3.up) * Quaternion.Euler(0, 0, Random.Range(0f, 360f)) * Quaternion.Euler(randomAngle, 0, 0) * Vector3.forward * Vector3.Distance(Vector3.zero, vector);

Debug.DrawRay(Camera.main.transform.position, rotatedVector, Color.black);

 

AI가 짜준 방식

이쪽이 더 효율적이다. 위에건 사람이 작동원리를 알기 쉬우니 그냥 둠. 다른 게임엔진에서 쓸수도 있고

var vector = Camera.main.transform.forward;
var angle = 5f;
var randomAngle = Random.Range(0, angle);
var rotatedVector = Quaternion.AngleAxis(randomAngle, Random.onUnitSphere) * vector;

Debug.DrawRay(Camera.main.transform.position, rotatedVector, Color.black);

 

 

WorldPosition을 ScreenPosition으로

var cam = Camera.main;
var screenPoint = RectTransformUtility.WorldToScreenPoint(cam, worldPosition);

 

 

그리고 하기는 예제이다

 

https://wmmu.tistory.com/search/WorldToScreenPoint

 

Wm뮤

자료정리용 개인공간

wmmu.tistory.com

 

 

WorldPosition, ScreenPosition, localRectPosion 종합세트

 

v1

더보기
#if UNITY_EDITOR
    public GameObject handle;
    void OnDrawGizmos()
    {


        // Draw a semitransparent blue cube at the transforms position
        var rectTransform = GetComponent<RectTransform>();
        if (rectTransform == null)
        {
            return;
        }
        var lossyScale = rectTransform.lossyScale;
        float wid = rectTransform.rect.width;
        float hei = rectTransform.rect.height;
        var pivot = rectTransform.pivot;

        Vector3 downPos = transform.up * lossyScale.y * hei * (pivot.y - 1);
        Vector3 upPos = transform.up * lossyScale.y * hei * pivot.y;
        Vector3 leftPos = transform.right * lossyScale.x * wid * (pivot.x - 1);
        Vector3 rightPos = transform.right * lossyScale.x * wid * pivot.x;

        Gizmos.color = Color.white;

        //꼭지점 추출
        var worldPositions = new Vector3[4];
        worldPositions[0] = transform.position + upPos + leftPos;
        worldPositions[1] = transform.position + upPos + rightPos;
        worldPositions[2] = transform.position + downPos + leftPos;
        worldPositions[3] = transform.position + downPos + rightPos;

        var worldHandlePosition = handle.transform.position;
        Gizmos.DrawLine(worldPositions[0], worldPositions[1]);
        Gizmos.DrawLine(worldPositions[2], worldPositions[3]);
        Gizmos.DrawLine(worldPositions[0], worldPositions[2]);
        Gizmos.DrawLine(worldPositions[1], worldPositions[3]);



        //worldPosition 2 screenPosition
        Vector2[] screenPositions;
        Vector2 screenHandlePosition;
        {

            var canvas = GetComponentInParent<Canvas>();
            Camera cam = null;
            switch (canvas.renderMode)
            {
                case RenderMode.ScreenSpaceOverlay:
                    break;
                case RenderMode.ScreenSpaceCamera:
                case RenderMode.WorldSpace:
                    cam = canvas.worldCamera;
                    break;
                default:
                    break;
            }
            if (cam == null)
            {
                cam = Camera.main;
            }

            screenPositions = System.Array.ConvertAll(worldPositions, wp => RectTransformUtility.WorldToScreenPoint(cam, wp));
            screenHandlePosition = RectTransformUtility.WorldToScreenPoint(cam, worldHandlePosition);

            for (int i = 0; i < 4; i++)
            {
                var color = Color.white;
                if (i < 2)
                {
                    color = Color.black;
                }
                var guiStyle = new GUIStyle();
                guiStyle.fontSize = 16;
                guiStyle.normal.textColor = color;
                UnityEditor.Handles.Label(worldPositions[i], $"wp[{i}] : {worldPositions[i].ToString("F2")}\nsp[{i}] : {screenPositions[i]}", guiStyle);
            }
        }




        //worldPosition 2 normalizedPosionLocal
        Vector2 localRectHandlePosion;
        {
            var l = (Quaternion.Inverse(transform.rotation) * (transform.position + leftPos)).x;
            var r = (Quaternion.Inverse(transform.rotation) * (transform.position + rightPos)).x;
            var t = (Quaternion.Inverse(transform.rotation) * (transform.position + upPos)).y;
            var d = (Quaternion.Inverse(transform.rotation) * (transform.position + downPos)).y;



            localRectHandlePosion = Quaternion.Inverse(transform.rotation) * worldHandlePosition;
            localRectHandlePosion.x = (localRectHandlePosion.x - l) / (r - l);
            localRectHandlePosion.y = (localRectHandlePosion.y - d) / (t - d);


            {
                var color = Color.green;
                var guiStyle = new GUIStyle();
                guiStyle.fontSize = 16;
                guiStyle.normal.textColor = color;
                UnityEditor.Handles.Label(worldHandlePosition, $"whp : {worldHandlePosition.ToString("F2")}\nshp : {screenHandlePosition}\nlrhp : {localRectHandlePosion.ToString("F2")}", guiStyle);
            }
        }

        //localRectHandlePosion 2 worldPosition
        {
            var l = (Quaternion.Inverse(transform.rotation) * (transform.position + leftPos)).x;
            var r = (Quaternion.Inverse(transform.rotation) * (transform.position + rightPos)).x;
            var t = (Quaternion.Inverse(transform.rotation) * (transform.position + upPos)).y;
            var d = (Quaternion.Inverse(transform.rotation) * (transform.position + downPos)).y;


            var worldPos = transform.rotation * new Vector3(l + localRectHandlePosion.x * (r - l), d + localRectHandlePosion.y * (t - d), 0);


            {
                var color = Color.gray;
                var guiStyle = new GUIStyle();
                guiStyle.fontSize = 16;
                guiStyle.normal.textColor = color;
                UnityEditor.Handles.Label(worldPos, "\n\n\nworldPos", guiStyle);
            }
        }

    }
#endif

 

 

v2


#if UNITY_EDITOR
    public GameObject handle;
    void OnDrawGizmos()
    {


        // Draw a semitransparent blue cube at the transforms position
        var rectTransform = GetComponent<RectTransform>();
        if (rectTransform == null)
        {
            return;
        }
        var lossyScale = rectTransform.lossyScale;
        float wid = rectTransform.rect.width;
        float hei = rectTransform.rect.height;
        var pivot = rectTransform.pivot;

        Vector3 downPos = transform.up * lossyScale.y * hei * (pivot.y - 1);
        Vector3 upPos = transform.up * lossyScale.y * hei * pivot.y;
        Vector3 leftPos = transform.right * lossyScale.x * wid * (pivot.x - 1);
        Vector3 rightPos = transform.right * lossyScale.x * wid * pivot.x;

        Gizmos.color = Color.white;

        //꼭지점 추출
        var worldPositions = new Vector3[4];
        worldPositions[0] = transform.position + upPos + leftPos;
        worldPositions[1] = transform.position + upPos + rightPos;
        worldPositions[2] = transform.position + downPos + leftPos;
        worldPositions[3] = transform.position + downPos + rightPos;

        var worldHandlePosition= handle.transform.position;
        Gizmos.DrawLine(worldPositions[0], worldPositions[1]);
        Gizmos.DrawLine(worldPositions[2], worldPositions[3]);
        Gizmos.DrawLine(worldPositions[0], worldPositions[2]);
        Gizmos.DrawLine(worldPositions[1], worldPositions[3]);



        //worldPosition 2 screenPosition
        Vector2[] screenPositions;
        Vector2 screenHandlePosition;
        {

            var canvas = GetComponentInParent<Canvas>();
            Camera cam = null;
            switch (canvas.renderMode)
            {
                case RenderMode.ScreenSpaceOverlay:
                    break;
                case RenderMode.ScreenSpaceCamera:
                case RenderMode.WorldSpace:
                    cam = canvas.worldCamera;
                    break;
                default:
                    break;
            }
            if (cam == null)
            {
                cam = Camera.main;
            }

            screenPositions = System.Array.ConvertAll(worldPositions, wp => RectTransformUtility.WorldToScreenPoint(cam, wp));
            screenHandlePosition = RectTransformUtility.WorldToScreenPoint(cam, worldHandlePosition);

            for (int i = 0; i < 4; i++)
            {
                var color = Color.white;
                if (i < 2)
                {
                    color = Color.black;
                }
                var guiStyle = new GUIStyle();
                guiStyle.fontSize = 16;
                guiStyle.normal.textColor = color;
                UnityEditor.Handles.Label(worldPositions[i], $"wp[{i}] : {worldPositions[i].ToString("F2")}\nsp[{i}] : {screenPositions[i]}", guiStyle);
            }
        }




        //worldPosition 2 normalizedPosionLocal
        Vector2 normalizedPositionLocal;
        {
            Vector2 localHandlePoint = rectTransform.InverseTransformPoint(worldHandlePosition);

            normalizedPositionLocal = (localHandlePoint- rectTransform.rect.min)/ rectTransform.rect.size;


            {
                var color = Color.green;
                var guiStyle = new GUIStyle();
                guiStyle.fontSize = 16;
                guiStyle.normal.textColor = color;
                UnityEditor.Handles.Label(worldHandlePosition, $"whp : {worldHandlePosition.ToString("F2")}\nshp : {screenHandlePosition}\nlhp : {normalizedPositionLocal.ToString("F2")}", guiStyle);
            }
        }

        //normalizedPosionLocal 2 worldPosition
        {
            var rect = rectTransform.rect;
            var  worldPos = transform.TransformPoint(rect.min + normalizedPositionLocal * rect.size);


            {
                var color = Color.gray;
                var guiStyle = new GUIStyle();
                guiStyle.fontSize = 16;
                guiStyle.normal.textColor = color;
                UnityEditor.Handles.Label(worldPos, "\n\n\nworldPos", guiStyle);
            }
        }

    }
#endif

 

 

 

 

 

 

 

씬뷰상 오브젝트 거리

아바타툴 만들때 사용함

var screenPoint = HandleUtility.WorldToGUIPoint( transform.position);
targets = targets.OrderBy(target => Vector2.Distance(HandleUtility.WorldToGUIPoint(target.transform.position), screenPoint)).ToArray();

 

 

 

 

 

 

 

 

 

'Unity > C#' 카테고리의 다른 글

유니티 빌드 관련 코드  (0) 2021.08.09
유니티 커스텀 인터페이스  (0) 2021.06.24
유니티 기즈모 (Gizmo) 관련코드  (0) 2021.06.15
posted by 모카쨩
2021. 6. 30. 14:58 깃허브

 

 

 

https://www.webfx.com/tools/emoji-cheat-sheet/

 

Emoji cheat sheet for GitHub, Basecamp and other services

Emoji codes used by GitHub, Basecamp, Slack and other services. Searchable. With emoji meanings.

www.webfx.com

 

여기서 원하는 이모티콘 누르면 복사가 되고 붙여넣기 하면 된다

posted by 모카쨩
2021. 6. 29. 19:31 깃허브

 

자꾸 귀찮게 이 창이 뜰 때

 

 

 

https://stackoverflow.com/questions/65467258/how-to-remove-github-login-popup-asking-for-credentials

이곳을 참고했다

 

 

 

 

 

git config -l --show-origin

치고

helper찾아서 user폴더하위가 아닌 .gitconfig를 지운다

 

 

 

 

 

 

옵션에서 Git의 메일을 설정해준다

 


'깃허브' 카테고리의 다른 글

깃허브 이모티콘 사용법  (0) 2021.06.30
GitHub 유저 초대  (0) 2021.06.28
GitHub Desktop 사용법  (0) 2021.06.28
posted by 모카쨩

저사양 유저용 블로그 진입