Get it on Google Play


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

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

Recent Comment

Archive


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

  1. 2020.12.02 포톤 설치
  2. 2020.12.01 유루캠 VR
  3. 2020.11.26 편광
  4. 2020.11.24 유니티 단축키
  5. 2020.11.23 c# 멀티스레드 기본소스
  6. 2020.11.18 전동킥보드 구매요령
  7. 2020.11.16 Resource ID out of range in GetResource
  8. 2020.11.15 서브스탠스 페인터 단축키
2020. 12. 2. 11:27 Unity/Photon

 

 

www.photonengine.com/ko-KR/

 

글로벌 크로스 플랫폼 실시간 게임 개발 | Photon Engine

MULTIPLAYER REALTIME PUN BOLT QUANTUM COMMUNICATION CHAT VOICE SELF-HOSTED SERVER 멀티플레이를 간단하게 실현합니다! Photon Realtime 인디/프로 개발자 누구나 실시간 멀티 플레이어 게임을 개발하여 세계로 진출할

www.photonengine.com

 

가입하고

 

dashboard.photonengine.com/ko-KR/

 

Multiplayer Game Development Made Easy | Photon Engine

MULTIPLAYER REALTIME PUN BOLT QUANTUM COMMUNICATION CHAT VOICE SELF-HOSTED SERVER We Make Multiplayer Simple Photon Realtime Develop and launch multiplayer games globally whether you are an indie developer or AAA studio. Create synchronous or asynchronous

id.photonengine.com

여기에 들어가서

 

Photon PUN은 VRChat같은거 만들때 씀, 전부 간접통신임

Photon BOLT는 오버워치 같은거 만들때 쓰고 직접통신, NAT나 방화벽등으로 인해 직접연결이 불가한경우 릴레이를 통한 간접연결이 됨, 방장이 나가면 방이 닫힌다

 

설정한다

 

 

 

어플리케이션 ID 필요함

 

 

 

 

유니티로 가서

 

PUN1

더보기

assetstore.unity.com/packages/tools/network/photon-unity-networking-classic-free-1786

 

다운로드해

 

펀 ID를 넣자

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PhotonInit : Photon.PunBehaviour
{
    public string serverName = "Default0001";
    public int roomNumber = 0;
    public Transform spawnPoint;
    public GameObject playerPrefab;



    // Start is called before the first frame update
    void Start()
    {
        PhotonNetwork.ConnectUsingSettings(serverName);
        PhotonNetwork.ConnectToBestCloudServer(serverName);
    }
    /// <summary>
    /// 로비에 들어가기 성공했을때
    /// </summary>
    public override void OnConnectedToPhoton()
    {
        Debug.Log("ConnectedToPhoton");
    }


    /// <summary>
    /// 로비에 들어가기 성공했을때
    /// </summary>
    public override void OnJoinedLobby()
    {
        Debug.Log("JoinedLobby");
        PhotonNetwork.JoinRandomRoom();
    }
    /// <summary>
    /// PhotonNetwork.autoJoinLobby 이 false 인 경우에만 마스터 서버에 연결되고 인증 후에 호출 
    /// </summary>
    public override void OnConnectedToMaster()
    {
        Debug.Log("ConnectedToMaster");
        PhotonNetwork.JoinLobby(); //로비접속
    }

    /// <summary>
    /// 룸입장실패
    /// </summary>
    /// <param name="codeAndMsg"></param>
    public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)
    {
        Debug.LogError("PhotonRandomJoinFailed");
        PhotonNetwork.CreateRoom(roomNumber.ToString());
    }

    /// <summary>
    /// 룸생성실패
    /// </summary>
    /// <param name="codeAndMsg"></param>
    public override void OnPhotonCreateRoomFailed(object[] codeAndMsg)
    {
        Debug.LogError("PhotonCreateRoomFailed");
        PhotonNetwork.JoinRandomRoom();
    }

    /// <summary>
    /// 룸생성 성공
    /// </summary>
    public override void OnCreatedRoom()
    {
        Debug.Log("CreatedRoom");
    }

    /// <summary>
    /// 룸접속 성공
    /// </summary>
    public override void OnJoinedRoom()
    {
        Debug.Log("JoinedRoom");
        CreatePlayer();
    }
    void CreatePlayer()
    {
        var pos = Vector3.zero;
        var rot = Quaternion.identity;
        if (spawnPoint != null)
        {
            pos = spawnPoint.position;
            rot = spawnPoint.rotation;
        }
        string objName = "Player";//플레이어 프리팹이 없으면 기본 플레이어가 호출됨
        if (playerPrefab != null)
        {
            objName = playerPrefab.name; //프리팹 이름은 Player로 하면 안됨
        }
        PhotonNetwork.Instantiate(objName, pos, rot);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

 

PUN2

더보기

https://assetstore.unity.com/packages/tools/network/pun-2-free-119922

 

PUN 2 - FREE | 네트워크 | Unity Asset Store

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

assetstore.unity.com

다운로드해

 

펀 ID를 넣자

 

using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PhotonInit : MonoBehaviourPunCallbacks
{
    public string serverName = "Default0001";
    public int roomNumber = 0;
    public Transform spawnPoint;
    public GameObject playerPrefab;



    // Start is called before the first frame update
    void Start()
    {
        PhotonNetwork.ConnectUsingSettings();
        PhotonNetwork.ConnectToBestCloudServer();
    }

    /// <summary>
    /// 로비에 들어가기 성공했을때
    /// </summary>
    public override void OnJoinedLobby()
    {
        Debug.Log("JoinedLobby");
        //PhotonNetwork.JoinRandomRoom(); //로비사용시
    }
    /// <summary>
    /// PhotonNetwork.autoJoinLobby 이 false 인 경우에만 마스터 서버에 연결되고 인증 후에 호출 
    /// </summary>
    public override void OnConnectedToMaster()
    {
        Debug.Log("ConnectedToMaster");
        PhotonNetwork.JoinRandomRoom();
        //PhotonNetwork.JoinLobby(); //로비접속 (로비사용시)
    }

    /// <summary>
    /// 룸입장실패
    /// </summary>
    /// <param name="codeAndMsg"></param>
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        Debug.LogError("PhotonRandomJoinFailed");
        PhotonNetwork.CreateRoom(roomNumber.ToString());
    }

    /// <summary>
    /// 룸생성실패
    /// </summary>
    /// <param name="codeAndMsg"></param>
    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        Debug.LogError("PhotonCreateRoomFailed");
        PhotonNetwork.JoinRandomRoom();
    }

    /// <summary>
    /// 룸생성 성공
    /// </summary>
    public override void OnCreatedRoom()
    {
        Debug.Log("CreatedRoom");
    }

    /// <summary>
    /// 룸접속 성공
    /// </summary>
    public override void OnJoinedRoom()
    {
        Debug.Log("JoinedRoom");
        CreatePlayer();
    }
    void CreatePlayer()
    {
        var pos = Vector3.zero;
        var rot = Quaternion.identity;
        if (spawnPoint != null)
        {
            pos = spawnPoint.position;
            rot = spawnPoint.rotation;
        }
        string objName = "My Robot Kyle -done-";//플레이어 프리팹이 없으면 기본 플레이어가 호출됨
        if (playerPrefab != null)
        {
            objName = playerPrefab.name; //프리팹 이름은 Player로 하면 안됨
        }
        PhotonNetwork.Instantiate(objName, pos, rot, 0);
    }

    // Update is called once per frame
    void Update()
    {

    }
}

 

 

 

 

 

 

이렇게 만들어서 

씬에 넣는다.

PUN2

 

 

 

 

api는 여기 참조

PUN1

doc-api.photonengine.com/ko-kr/pun/current/class_photon_1_1_pun_behaviour.html

 

실행하면 이렇게 나온다

 

PUN1

더보기

 

 

로그를 보면 이렇게

빨간줄이 있지만 단지 방이 없어서 뜬것이니 쫄지 말자 정상이다

 

PUN2

더보기

로그를 보면 이렇게

빨간줄이 있지만 단지 방이 없어서 뜬것이니 쫄지 말자 정상이다

 

 

 

 

 

 

시작하면 이렇게 나올것이다.

1. 포톤서버에 연결하고

2. 로비에 들어가서

3. 룸에 들어가는것이다

 

기본적인 네트워킹 시스템은 완성했다

 

 

 

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

포톤 챗  (0) 2021.07.07
포톤 볼트  (0) 2021.07.06
포톤 커스텀 플레이어 만들기  (0) 2021.07.04
posted by 모카쨩
2020. 12. 1. 20:19 카테고리 없음

 

 

posted by 모카쨩
2020. 11. 26. 16:05 공학기술

 

www.sciencenara.co.kr/index.html?branduid=973107

 

편광필름은 요오드가 도포된 PVA 필름을 늘여 만든다. 

때문에 예전과 달리 분자배열로 편광을 하기 때문에 두장을 겹쳤을경우 무아레 무늬가 생기지 않는다 

 

 

점착식 6600원

'공학기술' 카테고리의 다른 글

전기차에 변속기가 없는 이유  (0) 2020.12.15
전동킥보드 구매요령  (0) 2020.11.18
굴절각  (0) 2020.11.12
posted by 모카쨩
2020. 11. 24. 18:12 Unity

 

 

 

Ctrl + Shift + F : 선택한 오브젝트를 현재 씬뷰의 위치로 이동시킴

F : 씬뷰의 위치를 선택한 오브젝트의 위치로 이동시킴

posted by 모카쨩
2020. 11. 23. 16:26 윈도우폼

c# 멀티스레드풀 기본소스

(2015년에 짠 코드라 그렇지 이미지처리를 CPU로 하는 병신짓은 하지말자)

using System.Collections;



public bool multi_threadpool_MC(float[,] img1f)
{
    int img1wid = img1f.GetLength(0); // 기준 이미지 너비
    int img1hei = img1f.GetLength(1); //기준 이미지 높이

    int coreNum = 64; //스레드풀 갯수 설정

    EventWaitHandle[] threadSig = new EventWaitHandle[coreNum]; //스레드풀 계산 완료 시그널
    Hashtable[] ht_t = new Hashtable[coreNum];
    for (int i = 0; i < coreNum; i++)
    {
        threadSig[i] = new EventWaitHandle(false, EventResetMode.ManualReset);//서브스레드 대기 시그널 생성
        ht_t[i] = new Hashtable(); //인자를 전달할 해쉬테이블 생성
        ht_t[i]["num"] = i;
        ht_t[i]["coreNum"] = coreNum; //인자 박싱
        ht_t[i]["threadSig"] = threadSig[i];

        ht_t[i]["img1f"] = img1f; //계산처리할 데이터
        ht_t[i]["return"] = false; //반환값

        ThreadPool.QueueUserWorkItem(image_search_MC_thread, ht_t[i]);
    }
    WaitHandle.WaitAll(threadSig); //스레드 처리 완료 대기(최대 64개)
/*
  혹은
  for (i=0; i<coreNum; i++) 
  {
   threadSig[i].WaitOne();//스레드 처리 완료 대기
  }
*/
    bool _return_t = false;
    for (int i = 0; i < core_num; i++)
    {
        _return_t = _return_t || (bool)ht_t[i]["return"];
    }
    return _return_t;
}
private static void image_search_MC_thread(object hashtable_var)
{
    Hashtable ht = (Hashtable)hashtable_var; //오브젝트 언박싱


    int num = (int)ht["num"];
    int core_num = (int)ht["coreNum"];

    float[,] img1f = (float[,])ht["img1f"]; //해시테이블 언박싱
    int img1wid = img1f.GetLength(0); //1번째 차원 길이
    int img1hei = img1f.GetLength(1); //2번째 차원 길이
    for (int i = num; i < img1wid; i += core_num) //분산처리
    {
        for (int j = 0; j < img1hei; j++)
        {
            if (i==j) // 반환된 값이 True일 경우
            {
                ht["return"] = true;
            }

        }
    }

    //ht["return"] = false;
    ((EventWaitHandle)ht["_thread_sig"]).Set();
}

 

 

심플버전

    using UnityEngine;
    using System.Collections;
    using System.Threading; //스레드 시스템을 호출
    using System; //스레드에서 계산을 위해 닷넷 시스템 호출

    public class MultiThread : MonoBehaviour
    {
        private Thread thread;
        private EventWaitHandle threadSig;
        void Awake()
        {
            threadSig = new EventWaitHandle(false, EventResetMode.ManualReset);//서브스레드 대기 시그널 생성
            thread = new Thread(SubThread); //스레드를 생성
            thread.IsBackground = true; //백그라운드에서 동작(메인스레드의 하위로 들어감)
            thread.Start(); //스레드 시작

//기다리는동안 처리될코드

            threadSig.WaitOne();//서브스레드 처리 완료 대기중
            threadSig.Reset();//수신완료 리셋
        }
        private void SubThread()
        {
            //여기에 처리시킬 코드를 넣습니다 


            threadSig.Set(); //서브스레드 종료알림
        }
    }

 

 

 

멀티스레드 기본소스

//ver 0.1.2
using UnityEngine;
using System.Collections;
using System.Threading; //스레드 시스템을 호출
using System; //스레드에서 계산을 위해 닷넷 시스템 호출

public class multi_thread : MonoBehaviour {
 private Thread[] _thread;
 private EventWaitHandle[] _thread_sig;
 private EventWaitHandle _thread_sig_main ;
 private EventWaitHandle _thread_sig_end ;
 public int _core_num = SystemInfo.processorCount*16; //코어갯수 설정(코어갯수*16)
 private int i, j, k, l; //반복문용 변수 설정
 // Use this for initialization
 void Awake() {

  _thread = new Thread[_core_num];  //코어갯수에 맞게 스레드 생성
  _thread_sig = new EventWaitHandle[_core_num];  //코어갯수에 맞게 핸들생성



  _thread_sig_main=new EventWaitHandle(false,EventResetMode.ManualReset);  //메인스레드 처리 완료 알림 시그널 생성
  _thread_sig_end=new EventWaitHandle(false,EventResetMode.ManualReset);  //메인스레드 수신완료 시그널 생성
  for(i=0;i<_core_num;i++)
  {
   _thread_sig[i]=new EventWaitHandle(false,EventResetMode.ManualReset);//서브스레드 대기 시그널 생성
   _thread[i] = new Thread (subthread); //스레드를 생성
   _thread[i].IsBackground = true; //백그라운드에서 동작(메인스레드의 하위로 들어감)
   //_thread[i].Priority = ThreadPriority.Highest;  //백그라운드 스레드의 우선순위를 높음으로 변경(높을수록 빠름)
   //_thread[i].Priority = ThreadPriority.AboveNormal;  //백그라운드 스레드의 우선순위를 약간 높음으로 변경
   //_thread[i].Priority = ThreadPriority.Normal;  //백그라운드 스레드의 우선순위를 보통으로 변경
   _thread[i].Priority = ThreadPriority.BelowNormal;  //백그라운드 스레드의 우선순위를 약간 낮음으로 변경
   //_thread[i].Priority = ThreadPriority.Lowest;  //백그라운드 스레드의 우선순위를 낮음으로 변경(낮을수록 느림)
   _thread[i].Start (i); //스레드 시작
  }
 }
 // Update is called once per frame
 void LateUpdate ()   
 {
  _thread_sig_end.Reset();//수신완료 리셋
  _thread_sig_main.Set();//메인스레드 처리 완료 알림(서브스레드 시작)
  for (i=0; i<_core_num; i++) 
  {
   _thread_sig[i].WaitOne();//서브스레드 처리 완료 대기중
  }
  _thread_sig_main.Reset();//메인스레드 처리중 알림
  _thread_sig_end.Set();//메인스레드 수신 완료 알림
 }
 private void subthread(object _thread_num)
 {
  int _t_thread_num=(int)_thread_num; //스레드 번호 인자를 넘겨받은것을 언박싱
  
  while(true)
  {
   _thread_sig_main.WaitOne(); //메인스레드가 종료할때까지 대기

   /*
   여기에 처리시킬 코드를 넣습니다 
   예시
   for (int i=_t_thread_num; i<100000; i+=_core_num) 
   {
    _t += i;
   }
    */


   _thread_sig[_t_thread_num].Set(); //서브스레드 종료알림
   _thread_sig_end.WaitOne(); //메인스레드가 수신했는지
   _thread_sig[_t_thread_num].Reset(); //서브스레드 재가동 알림
 }
}

 

 

일반함수처럼 쓸수있는 스레드. (태스크)

test(); 같은식으로 호출해주면 됨

비동기로 작동한다

주의점은 유니티가 종료되어도 계속 작동해서 가급적 코루틴을 쓰자

async void test()
{
    await Task.Run(() => {
        while (true)
        {
            System.Threading.Thread.Sleep(1000);
            Debug.Log($"테스트 {System.DateTime.Now}");
        }
    });
}

 

 

태스크, 코루틴이랑 비슷하지만 유니티가 종료되어도 계속 작동한다

유니티 함수계열은 안 된다(디버그로그는 된다)

var t = System.Threading.Tasks.Task.Run(() => {
    //System.Threading.Tasks.Task.Delay(10000).Wait();
    System.Threading.Thread.Sleep(10000);
    Debug.Log("Task ended delay...");
});

 

 

반환값이 있는 태스크

주의점은 result호출시 계산이 끝날때까지 기다린다

Debug.Log($"Start {System.DateTime.Now}");

var t = System.Threading.Tasks.Task.Run(() => {
    System.Threading.Thread.Sleep(10000);
    Debug.Log($"Task ended delay... {System.DateTime.Now}");
});



var t2 = System.Threading.Tasks.Task.Run(() => {
    System.Threading.Thread.Sleep(3000);
    return System.DateTime.Now;
});
Debug.Log($"Task2 ended delay...{t2.Result}"); //result구하면서 wait가 걸린다

'윈도우폼' 카테고리의 다른 글

윈폼 키보드마우스  (0) 2021.01.17
자주 쓰는 윈폼 코드 모음  (0) 2020.10.31
c# 윈도우 폼  (0) 2018.01.28
posted by 모카쨩
2020. 11. 18. 16:21 공학기술

 

FastWheel 전동킥보드

무게 : 9.7kg

최대하중 : 120kg

등판각도 : 15도라고 써있는데 실질적으론 15%정도임 환산하면 4.33도 

배터리 : 160wh라고 써있고 158.4wh임 ( 36V / 4.4Ah) 탈착식배터리

모터 출력 : 250w

바퀴 : 6인치 튜브타이어

주행거리 : 25km라고 써있는데 당연히 그만큼은 안간다

 

장점

폴딩이 편함, 하단에 작은 바퀴도 달려있어 끌고이동하기도 좋음

 

단점

속도계 없음, 전조등 없음, 후미등 없음, 킥스탠드 없음

운행중 배터리단자가 쉽게 파손됨, 수직으로 탈착하는 방식은 사면 안된다

펑크가 쉽게 남

모스펫이 쉽게 타버려서 경사주행같은건 하면 안 됨

 

 

 

 

 

 

 

 

 

 

레이윙 카본 전동킥보드

무게 : 12kg

최대하중 : 120kg

등판각도 : 20도라고 써있는데 실질적으론 7도정도임 %로 가정하고 환산하면 5.81도

배터리 : 36V / 4.2Ah 일체형배터리

모터 출력 : 500w

바퀴 : 8인치 솔리드타이어

주행거리 : 20km라고 써있는데 체감은 5km임, 언덕자주타서 그런진 몰라도

장점

8인치에 듀얼 쇼바라 그런지 승차감이 괜찮음

전후 솔리드라서 펑크가 나지 않는다

기본전조등이 의외로 세다

단점

후미등 충전이 번거로움. 다행히 배터리 시간은 길긴하더라

후방 브레이크가 쉽게 파손됨

전기브레이크 힘이 너무 약함

C6의 경우엔 배터리가 너무 부족함 2.5km부터 최대속도를 내기 힘들어짐

핸들 홀딩이 안되어서 들고 옮길때 힘들다

 

 

여태 타본것 두가지

 

-브레이크가 잘 잡히는지

후방브레이크는 디스크나 드럼방식이 좋다. 밟는방식은 바퀴마모가 있을뿐더러 파손이 쉬움

-배터리가 8Ah이상인게 좋다

-바퀴 인치수가 높을수록 좋음, 6인치로 인도주행은 바퀴파손을 일으키기 때문에 사실상 불가능하다 보면됨

-탈착식이면 단자가 좋아야 함, 쉽게 파손되니까. 일체형이면 집안에 들고갈정도 사이즈여야만 함 

-회생제동 되는 킥보드는 없으니까 현혹되지 말것, 다 개구라임

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'공학기술' 카테고리의 다른 글

편광  (0) 2020.11.26
굴절각  (0) 2020.11.12
기계부품 자료 모음  (0) 2020.11.10
posted by 모카쨩
2020. 11. 16. 11:42 Unity

Texture2D가 매프레임마다 생성됨,

얘는 씬이동이나 오브젝트 삭제시에도 안 지워지므로 반드시 한번만 생성해서 쓰는식으로 해야함

'Unity' 카테고리의 다른 글

유니티 단축키  (0) 2020.11.24
Streaming of 'mpeg' on this platform is not supported  (0) 2020.11.11
투명 렌더텍스처  (0) 2020.11.10
posted by 모카쨩
2020. 11. 15. 14:34 3D/서브스탠스 페인터

 

 

1 : 페인팅

2 : 지우개

 

 

뷰이동

Alt + 가운데클릭 : 보고있는 시점화면 기준으로 뷰 이동

Alt + 우클릭 : 앞뒤로 뷰 이동

Alt + 좌클릭 : 뷰 회전

 

 

 

'3D > 서브스탠스 페인터' 카테고리의 다른 글

서브스탠스 페인터 주름  (0) 2022.01.04
서브스탠스 페인터 기초  (0) 2022.01.04
서브스탠스 페인터 2020 유리설정  (0) 2020.07.18
posted by 모카쨩

저사양 유저용 블로그 진입