172만명의 커뮤니티!! 함께 토론해봐요.
미해결
파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
안녕하세요 선생님. 인증받지 않은 유저의 웹소켓 접근을 거부하려고 하는데요, Traceback (most recent call last): File "/Users/sunnnwo/workspace/pongchatT/venv/lib/python3.11/site-packages/django/contrib/staticfiles/handlers.py", line 101, in __call__ return await self.application(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/sunnnwo/workspace/pongchatT/venv/lib/python3.11/site-packages/channels/routing.py", line 62, in __call__ return await application(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/sunnnwo/workspace/pongchatT/venv/lib/python3.11/site-packages/channels/sessions.py", line 47, in __call__ return await self.inner(dict(scope, cookies=cookies), receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/sunnnwo/workspace/pongchatT/venv/lib/python3.11/site-packages/channels/sessions.py", line 263, in __call__ return await self.inner(wrapper.scope, receive, wrapper.send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/sunnnwo/workspace/pongchatT/venv/lib/python3.11/site-packages/channels/auth.py", line 185, in __call__ return await super().__call__(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/sunnnwo/workspace/pongchatT/venv/lib/python3.11/site-packages/channels/middleware.py", line 24, in __call__ return await self.inner(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: 'list' object is not callable WebSocket DISCONNECT /ws/chat/test/chat/ [127.0.0.1:61013] HTTP GET /chat/ 200 [0.01, 127.0.0.1:61007] /Users/sunnnwo/workspace/pongchat/mysite/asgi.py changed, reloading. Watching for file changes with StatReloader 아래와 같이 설정하고 실행해봤는데, 위와 같은 에러가 발생했습니다. AuthMiddlewareStack을 이용하여 인증된 사용자만 채팅할 수 있게 하려면 어느 부분을 수정해야할까요. 감사합니다. 좋은 하루되세요. asgi.py application = ProtocolTypeRouter({ "http" : django_asgi_app, "websocket" : AuthMiddlewareStack( app.routing.websocket_urlpatterns + chat.routing.websocket_urlpatterns, ), }) consumers.py from asgiref.sync import async_to_sync from channels.generic.websocket import JsonWebsocketConsumer # 모든 유저가 고정된 채널 레이어 그룹을 가질것. class ChatConsumer(JsonWebsocketConsumer): SQUARE_GROUP_NAME = "square" groups = [SQUARE_GROUP_NAME] def receive_json(self, content, **kwargs): # user = self.scope["user"] user = self.scope["user"] _type = content["type"] if not user.is_authenticated: self.close() else: if _type == "chat.message": message = content["message"] async_to_sync(self.channel_layer.group_send)( self.SQUARE_GROUP_NAME, { "type": "chat.message", "message": message, } ) else: print(f"Invalid message type : ${_type}") def chat_message(self, message_dict): self.send_json({ "type": "chat.message", "message": message_dict["message"], }) chat/routing.py from django.urls import path, re_path from chat import consumers websocket_urlpatterns = [ path("ws/chat/<str:room_name>/chat/", consumers.ChatConsumer.as_asgi()), ] chat/urls.py urlpatterns=[ path("", views.index, name = "index"), path("<str:room_name>/chat/", views.room_chat, name = "room_chat" ), ]
python django django-channels
sunnnwo
2025-02-12T00:09:20.599Z
댓글 1
좋아요 0
조회수 140
미해결
직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
선생님 강의랑 블로그 참고해서, 문서 내 특정 문자들을 찾아서 수식으로 바꾸는 작업을 진행했습니다. A라는 문자가 문서 내에 있으면, 찾기 기능으로 찾은 뒤에 수식 편집기를 열어서 rm A로 바꿔주는 작업을 합니다. 그런데 문자를 전부 수식으로 바꾸고 나니 글자들의 간격이 다 벌어져있네요... 수식을 누르고 방향키로 빠져나오거나, 개체 속성에 들어갔다 나오면 다시 돌아오는 상황입니다. 왜 이런 일이 발생하는지 잘 모르겠고, 어떻게 해결할 수 있을까요? https://employeecoding.tistory.com/194 수식 넣을 때 코드는 이 게시글에 있는 코드를 사용했습니다.
손주환
2025-02-11T18:14:59.772Z
댓글 1
좋아요 1
조회수 797
해결됨
38군데 합격 비법, 2026 코딩테스트 필수 알고리즘
1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 어떤 알고리즘을 학습하고 계신가요? 여기까지 이해하신 내용은 무엇인가요? 2. 어려움을 겪는 부분 어느 부분에서 막히셨나요? 코드의 어떤 로직이 이해가 안 되시나요? 어떤 개념이 헷갈리시나요? 3. 시도해보신 내용 문제 해결을 위해 어떤 시도를 해보셨나요? 에러가 발생했다면 어떤 에러인가요? 현재 작성하신 코드를 공유해주세요 이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
python 코딩-테스트 알고리즘 data-structure
2025-02-11T14:39:46.630Z
댓글 2
좋아요 0
조회수 215
미해결
직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
8-1. 사이트의 글목록을 크롤링하여 엑셀에 담기 강의 관련입니다. 예전에 흘려듣기 식으로 이 강의를 봤을 때는 분명 강의 내용과 같이 연세대학교 산학협력단의 보유 특허 검색 페이지에서 검색이 되었었는데요. 본격적으로 따라하며 익혀보려고 해당 웹페이지에 가보니 예전과 달리 검색이 되지 않습니다.(아래와 같이 보임) 연세대학교 산학협력단 홈페이지의 문제라면 일코님의 문제가 아니긴 하지만 해당 홈페이지를 이용하여 실습하는 입장에서는, 기존에 멀쩡하던 강의가 실용성을 확 잃게 되는 듯한 안타까움이 있습니다. 제가 확인한 것처럼 현재는 보유 특허 검색이 안되는 것이 맞는지 한 번 확인 부탁드립니다. 또한 이 상태로 동일한 내용을 따라하기 실습이 가능한지를 확인 부탁드립니다. 동일하게 따라하기 실습을 못한다면 이 챕터는 넘겨야 될 거 같습니다. 제가 크롤링 경험이 많고 능숙하다면 어떻게든 도움이 되겠으나, 아직 전혀 모르는 분야인 크롤링에서 정처없이 헤맬 거 같아서 그렇습니다. 일단, 요 챕터 말고 실습이 가능한 다른 부분 부터 공부해 볼게요. 감사합니다.
learner
2025-02-11T14:38:07.808Z
댓글 1
좋아요 1
조회수 158
미해결
파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
이 강의는 어떤 식으로 접근해야 되나요? 이런 것이 있구나~ 라고 생각하고 넘어가야 하나요? 아니면 하나하나 다 알아가면서 넘어가는 것이 좋나요?
react python django web-api htmx
주인국
2025-02-11T09:41:09.421Z
댓글 2
좋아요 0
조회수 222
미해결
파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
version: '3.8' services: postgres: image: postgres:14 env_file: .env volumes: - postgres_data:/var/lib/postgresql/data networks: - backend django: build: context: ./backend dockerfile: Dockerfile ports: - "8000:8000" volumes: - ./backend:/app - static_volume:/app/myproject/staticfiles - ./frontend:/app/myproject/myapp/static/myapp - media_volume:/app/myproject/media depends_on: - postgres - redis environment: - PYTHONUNBUFFERED=1 - DJANGO_SETTINGS_MODULE=myproject.settings env_file: .env networks: - frontend - backend redis: image: redis:6 networks: - backend nginx: build: ./nginx volumes: - media_volume:/usr/share/nginx/html/media - static_volume:/usr/share/nginx/html/static - ./frontend:/usr/share/nginx/html/frontend ports: - "8443:8443" depends_on: - django networks: - frontend - backend adminer: image: adminer:latest restart: always ports: - "8080:8080" networks: - backend depends_on: - postgres volumes: postgres_data: static_volume: media_volume: networks: backend: frontend: docker-compose 설정인데요, 저희 팀원이 만들때 templates 폴더를 안쓰고 전부 .js 파일로 만들어놨습니다. 이런 경우 채팅 모듈을 추가하려고하면 어떤 방식으로 해야할까요. 강의외적인 부분 질문드려서 죄송합니다.
python django django-channels
sunnnwo
2025-02-11T08:45:01.454Z
댓글 3
좋아요 0
조회수 246
미해결
6일 만에 배우는 파이토치 딥러닝 기초
2일차 참조 답안을 보면 학습을 두 번 시키는 이유가 있을까요? 학습을 두 번 시키면 과적합이 발생하지 않나요?
남길우
2025-02-11T07:10:27.798Z
댓글 2
좋아요 0
조회수 162
해결됨
38군데 합격 비법, 2026 코딩테스트 필수 알고리즘
def find_alphabet_occurrence_array(string): alphabet_occurrence_array = [0] * 26 for char in string: if not char.isalpha(): continue arr_index = ord(char) - ord('a') -> alphabet_occurrence_array[arr_index] += 1 return alphabet_occurrence_array print("정답 = [3, 1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 2, 2, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0] \n현재 풀이 값 =", find_alphabet_occurrence_array("Hello my name is sparta")) print("정답 = [2, 1, 2, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0] \n현재 풀이 값 =", find_alphabet_occurrence_array("Sparta coding club")) print("정답 = [2, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 3, 3, 0, 0, 0, 0, 0, 0] \n현재 풀이 값 =", find_alphabet_occurrence_array("best of best sparta")) 안녕하세요! 1주차 알고리즘과 친해지기 (2) 애서 첫번째 Hello my name is sparta 의 정답이 왜 "정답 = [3, 1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 2, 2, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0] 인가요? [3, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0, 2, 2, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0] 아닌가요?
python 코딩-테스트 알고리즘 data-structure
maran0119
2025-02-11T06:43:39.061Z
댓글 3
좋아요 0
조회수 241
미해결
[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬트리의 xNode에서 노드 하나에 In 으로 들어오는 포트는 여러개가 설정가능한데 out 도 여러개로 나가게 하고 싶은데 잘 되지 않아 이 부분의 해결방법에 대한 조언을 질문드립니다.
coffeecat0213
2025-02-11T06:14:57.864Z
댓글 3
좋아요 0
조회수 176
미해결
파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
해당 기능을 구현까지 완료했고, 결과는 도출합니다. 궁금한 점이 사용자가 채팅방을 나간 후 퇴장 처리 메세지가 창에 나타날 때 Delay? 나간 후 한참 시간이 지난 후에 나타나는데, 자연스러운 상황인지 아니면 제가 잘못한 건지 판단이 되지 않습니다..
python django django-channels
임찬
2025-02-11T00:10:21.812Z
댓글 2
좋아요 0
조회수 208
해결됨
책 3권을 영상으로 만든 Unity 게임 개발
그 처음 스워드맨 애니메이션 만들때 스워드맨idle은 스프라이트 클릭해서 이미지를 추가시켰는데 왜 스워드맨 어택모션은 추가시키지말고 드래그해서 아는지 다시 한번 설명해주실 수 있나요?? 이해가 잘 안되서요 그리고 스워드맨 idle처음 생성할때 왜 마지막 점포인트는 삭제하는지 알 수 있을까요
킴주니
2025-02-10T23:01:16.185Z
댓글 1
좋아요 1
조회수 135
미해결
[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
네이버 지식인 여러페이지 정적 크롤링은 강의에 있어서 따라하니 잘 되는데 동적 페이지 크롤링인 네이버 쇼핑은 for i in 코드를 넣으니 넘어가지지가 않네요 ㅜㅜ 동적 페이지 크롤링인 네이버 쇼핑 여러페이지 넘어갈때는 다른 코드를 작성해야하는걸까요? 네이버 지식인 여러페이지 크롤링 할 때처럼 하니 페이지가 안넘어가지네요...
원트
2025-02-10T12:53:53.604Z
댓글 2
좋아요 0
조회수 797
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 저는 몬스터가 캐릭터를 때릴때 미끄러져서 캐릭터에 딱 붙는 현상이 있어서 그걸 해결 하고 내용을 공유 드릴려고 글을 씁니다. NavMeshAgent 를 쓰시는 분들에 한해서 인데요 https://onecoke.tistory.com/entry/Unity3D-NavMeshAgent-%EB%AF%B8%EB%81%84%EB%9F%AC%EC%A7%90-or-%EC%88%9C%EA%B0%84%EC%9D%B4%EB%8F%99-%ED%98%84%EC%83%81 위 링크 분이 해결하신 분인데 NavMeshAgent 내에 Velocity 값이 존재 해서 velocity 가 zero 가 될때까지 미끄러 진다고 하네요 해결은 MonsterController 에서 UpdataSkill 내에 NavMeshAgent 의 값을 Vector3.zero 로 넣어주니까 몬스터의 미끄러지는 부분이 해결 됐습니다. NavMeshAgent가 문제가 많네요.. 강의 올려주신 Rookiss 선생님 항상 건강하시고 새해 복 많이 받으세요
sunrise3225
2025-02-10T12:16:07.916Z
댓글 1
좋아요 0
조회수 150
미해결
파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
vscode (windows)사용 기존) mydjango02 폴더--> django 설치 --> startproject --> manage.py 생성 질문 1) mydjango 03 폴더 --> django 설치 --> django runserver가 돌아가지 않습니다. 질문 2) 이전에 따라하기에선 django runserver가 돌아갔었는데 디버그시 mydjango.py가 나타나지 않았습니다. 그래서 실습을 기존에 설치된 manage.py로 했는데 제가 어느 부분에서 실수 할 가능성이 있을까요?
react python django web-api htmx
lkh5040
2025-02-10T07:50:28.892Z
댓글 3
좋아요 0
조회수 186
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
race condition 문제에서 예시에서 10만번 반복했을 땐 문제가 생기지만 만번 반복했을땐 0 이 나오는 이유는 뭘까요 ?
릴뭐뭐
2025-02-10T07:01:52.810Z
댓글 1
좋아요 0
조회수 107
미해결
직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
일코님, 안녕하세요. 오랜만에 질문 올립니다. 여러 장이 있는 hwp파일의 첫 페이지부터 한 페이지 씩 1.hwp, 2.hwp, 3.hwp, ... 로 저장하는 코드를 작성해 보았는데요. 한 가지 문제점만 빼면 원하는 대로 작동합니다. 한 가지 문제점은, 코드 실행 후 저장된 1.hwp 파일 속에 1페이지가 아닌 전체 페이지가 들어가 있다는 점입니다. 그거 외에 다른 페이지는 문제 없이 작동되고 있습니다. 이거 왜 그럴까요? 코드를 반복해서 살펴봐도, 논리적으로는 저장되는 1.hwp 파일에는 원본파일의 첫 페이지만 들어가 있어야 할 거 같은데.. 그렇게 안되는 이유가 궁금합니다. 전체 코드는 아래와 같습니다. import os from pyhwpx import Hwp hwp = Hwp() target_dir = r"D:\magicfolder" os.chdir(target_dir) hwp.add_tab() hwp.switch_to(0) # 탭0: 카피해 올 원본 파일용 hwp.open("D:\magicfolder\페이지분할대상.hwp") hwp.switch_to(1) # 탭1: 한 페이지씩 붙여서 저장할 일종의 작업공간 hwp.open("D:\magicfolder\페이지분할대상.hwp") hwp.switch_to(0) for j in range(1, hwp.PageCount + 1): hwp.goto_page(j) hwp.CopyPage() hwp.switch_to(1) hwp.HAction.Run("SelectAll") hwp.HAction.Run("Delete") hwp.MoveDocBegin() hwp.PastePage() # 바로 위에서 hwp.PastePage()할 때 페이지가 넘어가서 붙으므로, 앞 페이지로 당겨 붙이기 위해서 맨 위 페이지로 커서 옮기고 Del 2번 해 준 것임. hwp.MoveDocBegin() hwp.HAction.Run("Delete") hwp.HAction.Run("Delete") hwp.save_as(target_dir + "\\" + str(j) + ".hwp") hwp.switch_to(0) hwp.Close() hwp.FileClose() 코드를 많이 짜봐야 늘텐데 정말 오랜만에 시도해 본 거 같습니다. ^^ㅋ
learner
2025-02-10T05:24:47.483Z
댓글 0
좋아요 0
조회수 507
미해결
파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
똑같이 코딩한거같은데 Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING 이런 문제가 생겨 connect()에서 console.log로 this.ws 찍어보니까. readystate가 0에서 바뀌지 않고 onsubmit()에서도 0인걸 확인했습니다. 그래서 웹소켓이 연결되지 않았으니, this.ws.send()에서 걸리는것이라고 생각은하는데, 어디를 고쳐야 될지 모르겠습니다. {# Chat room #} {% extends "chat/base.html" %} {% block extra-style %} <style> .chat-message > div { background-color: #3b3b3b; color: #e1e1e1; border-radius: 0.8em; padding: 0.4em; margin: 0.4em 0; display: inline-block; white-space: pre-wrap; max-width: 80%; word-wrap: break-word; } </style> {% endblock %} {% block content %} <h2>채팅방 :{{ room_name }}</h2> {# 웹소켓으로 실시간 채팅 기능 구현하기 #} <div class="container"> <div class="row"> <div class="col-sm-12"> <div class="card" style="height: 600px;"> <div class="card-header"> 채팅방:{{ room_name }} </div> <div class="card-body overflow-hidden"> <div id="chat_messages" class="w-100 h-100 border-0 overflow-hidden overflow-scroll"></div> </div> <div class="card-footer"> <form id="message_form"> <input type="text" name="message" class="form-control" autofocus autocomplete="off" /> </form> </div> </div> <hr class="my-3" /> <a href="{% url 'chat:index' %}" class="btn btn-primary"> 대기실로 이동 </a> </div> </div> </div> {% endblock %} {% block extra-script %} <script> const handler = { chat_messages_tag: null, ws: null, retry: 0, init(){ console.log("handler.init() 실행됨"); this.chat_messages_tag= document.querySelector("#chat_messages"); document.querySelector("#message_form").addEventListener("submit", this.onsubmit.bind(this)); }, connect(ws_url){ if(this.ws) { this.ws.close(); } this.ws = new WebSocket(ws_url || this.ws?.url); console.log(this.ws, "연결1.") this.ws.onopen = this.onopen.bind(this); this.ws.onclose = this.onclose.bind(this); this.ws.onerror = this.onerror.bind(this); this.ws.onmessage = this.onmessage.bind(this); }, reconnect() { this.connect(); }, onopen(){ console.log("웹소켓 서버와 접속, : Room_chat"); this.retry = 0; }, onclose(event){ if (!event.wasClean) { console.error("웹소켓이 죽었거나, 네트워크 에러"); if (this.retry < 3) { this.retry++; setTimeout(() => { this.reconnect(); console.log(`[${this.retry}] 접속 재시도 ...`); }, 1000 * this.retry) } else { console.log("웹소켓 서버에 접속할수 없습니다. 메인페이지로 이동합니다."); window.location.href = "{% url 'chat:index' %}"; } } }, onerror(){ console.log("웹소켓 에러 발생. 메인페이지로 이동합니다."); window.location.href = "{% url 'chat:index' %}" ; }, onmessage(event){ const message_json = event.data; console.log("메세지 수신 :", message_json); const { type, message } = JSON.parse(message_json); switch (type){ case "chat.message": this.append_message(message); break; default: console.error('Invalid message type: &{type}'); } }, append_message(message){//인자로 받은 채팅 메세지 로그에 추가 const element = document.createElement("div"); element.className = "chat-message"; const wrapper = document.createElement("div"); wrapper.textContent = message; element.appendChild(wrapper); this.chat_messages_tag.appendChild(element); this.chat_messages_tag.scrollTop = this.chat_messages_tag.scrollHeight; }, onsubmit(event){ //입력된 채팅 메세지 문자열을 획득하고, 메세지 로그에 추가. event.preventDefault(); const form_data = new FormData(event.target); //폼필드의 값을 오브젝트로 변환하여 props로 저장하고, 폼필드는 리셋합니다. const props = Object.fromEntries(form_data); event.target.reset(); // reset form const { message } = props; console.log("웹소켓으로 전송할 메세지: ", message); console.log(this.ws, "onsubmit"); {#this.append_message(message);#} this.ws.send(JSON.stringify({ type: "chat.message", message: message, })) } }; handler.init(); const protocol = location.protocol === 'https:' ? 'ws:' : 'wss:'; const ws_url = protocol + "//" + location.host + "/ws" + location.pathname; handler.connect(ws_url); </script> {% endblock %} from django.urls import path from chat import consumers websocket_urlpatterns = [ path("ws/chat/<str:room_name>/chat/", consumers.ChatConsumer.as_asgi()), ] import os from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application import app.routing import chat.routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') django_asgi_app = get_asgi_application() application = ProtocolTypeRouter({ "http" : django_asgi_app, "websocket" : URLRouter( chat.routing.websocket_urlpatterns + app.routing.websocket_urlpatterns, ) }) from django.shortcuts import render # Create your views here. def index(request): return render(request, "chat/index.html") def room_chat(request, room_name): return render(request, "chat/room_chat.html",{ "room_name": room_name, })
python django django-channels
sunnnwo
2025-02-09T23:37:24.758Z
댓글 2
좋아요 0
조회수 171
해결됨
[Unity6] 나만의 서바이벌 게임 만들기
move에 대한 animator 작업도 진행하고 코드작업도 진행을 했는데요. 처음 게임 시작누르고 방향키를 한 2~3초눌러야 run상태로 가더라고요. idle상태는 그거보단 빠른 1초정도? 어떤게 문제일까요.. condition에서 스피드에 대한 값도 지정해서 0.1 0.01까지 낮춰보았고, setting에서 exit time과 transition duration까지 낮춰보면서 해봤는데 안되네요. 음 좀 보는데 idle에서 모션변환까지 duration이 좀 걸리는거같은데요.. void Move() { // key 방향 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 cameraForward = Camera.main.transform.forward; Vector3 cameraRight = Camera.main.transform.right; cameraForward.y = 0.0f; cameraRight.y = 0.0f; cameraForward.Normalize(); cameraRight.Normalize(); Vector3 moveDirection = cameraRight * horizontal + cameraForward * vertical; // mobile, pc 속도 차이 줄이기위해 controller.Move(moveDirection * moveSpeed * Time.deltaTime); // moveDirection.magnitude를 좀 더 빠르게 반영하도록 float currentSpeed = moveDirection.magnitude * moveSpeed; animator.SetFloat("a_Speed", currentSpeed); }
Tae In Kim
2025-02-09T19:09:44.578Z
댓글 2
좋아요 0
조회수 164
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 선생님 강좌 너무 잘 듣고 있습니다. 다름이 아니라 13:40초에 캐릭터와 몬스터가 서로 충돌해서 밀리는 현상을 설명 해주신대로 NavMeshAgent 를 삭제하고 일반적인 이동 방식으로 수정해서 잘 사용하고 있습니다. 근데 혹시 NavMeshAgent 를 나는 꼭 써서 해야돼 라고 생각 하시는 분들은 구글을 찾아 봤는데 NavMeshAgent nma = gameObject.GetOrAddComponent<NavMeshAgent>(); // nma 로 NavMeshAgent 를 불러와서 nma.obstacleAvoidanceType = ObstacleAvoidanceType.NoObstacleAvoidance; // obstacleAvoidanceType 을 NoObstacleAvoiddance 로 교체를 해주면 네브메쉬를 가지고 있어도 서로 충돌하지는 않는거 같습니다. 혹시 저처럼 궁금한 분들이 있을까봐 남깁니다. 선생님 날씨가 추운데 감기 조심하시고 강의 더 집중해서 듣겠습니다.
sunrise3225
2025-02-09T15:27:32.970Z
댓글 1
좋아요 1
조회수 233
해결됨
유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
Title 씬 프리팹 관련 질문이 있습니다. Q1. 타이틀 프리팹에 별도의 UI만 보여주는 카메라를 만든 이유가 무엇인가요? (main 카메라가 아닌 별도의 카메라를 만들고 또 그것을 프리팹에 넣은 이유) Q2. Title의 경우 프리팹에 캔버스까지 있습니다. 궁금한 것은 InGame에서 각각 UI들도 프리팹으로 만들텐데, 다 이렇게 개별 UI 프리팹마다 캔버스를 만드는 것이 좋은가요? (프리팹 안에 캔버스를 넣는 이유와, 주의해야 할 사항) * ) 제가 예전에 작업을 할 때, 큰 UI 캔버스 만들고 하위로 캔버스를 가진 UI프리팹들을 넣으니까, 가끔 프리팹 창에서 수정할 때 UI들이 화면에 보이지 않았던 경험이 있어서 질문드립니다! 좋은 강의 감사합니다 🙂 남은 강의도 잘 챙겨 보겠습니다!
Kyuarez
2025-02-09T13:47:20.467Z
댓글 2
좋아요 0
조회수 222