2014-09-27 5 views
4

대부분 유니티 튜토리얼과 같이 업데이트 함수 내에서 마우스 이벤트를 사용하는 것이 좋습니다 :유니티 글로벌 마우스 이벤트

function Update() { 

    if (UnityEngine.Input.GetMouseButton(1)) { 

    } 

} 

이것은 전원을 JS에서 AS 또는 setInterval을에 onEnterFrame과 사용하는 등 정말 비효율적하지만, 유사한 저를 친다 전체 응용 프로그램 - 나는 이벤트 기반 시스템을 사용하는 것을 선호합니다.

OnMouseDown() 메서드는 유용하지만 MouseDown이 개체에 있거나 장면의 어느 곳에서나 발생하는 경우에만 발생합니다.

여기에 질문입니다. 마우스 버튼이 전역으로 내려 졌는지 또는 업데이트 솔루션이 권장되는 옵션인지를 감지하기 위해 Unity에 MouseEvent가 있습니까?

+2

정말 비효율적이지 않습니다. 사실 어떤 이벤트 중심 입력 시스템이라도 바로 그 일을 수행하므로 이벤트 중심 접근 방식은 더 많은 오버 헤드가 발생할 수 있습니다. – LearnCocos2D

답변

4

이 날 같은 정말하지만 비효율적 전체 응용 프로그램 전원을 JS에서 AS 또는 setInterval을에 onEnterFrame과를 사용하는 것과 비슷 파업 - 내가 정말 이벤트를 기반 시스템을 사용하는 것을 선호 것입니다.

이미 지적한 바와 같이, 이것은 덜 효율적 일 필요는 없습니다. 모든 이벤트 기반 시스템은 아마도 뒷 배경처럼 폴링 루틴을 사용하고 있으며, 주어진 빈도로 업데이트됩니다.

많은 게임 엔진/프레임 워크에서 입력 처리를위한 폴링 기반 접근 방식을 찾습니다. 이것은 입력 업데이트 빈도가 프레임 속도/업데이트 루프 빈도와 직접적으로 관련된다는 사실과 관련이 있다고 생각합니다. 사실 게임 루프보다 높거나 낮은 빈도로 입력을 듣는 것은별로 의미가 없습니다.

그래서 여기에 질문입니다 : 마우스 버튼이 눌러져 세계적으로, 또는 업데이트 솔루션은 옵션을 사용하는 것이 좋습니다 경우 을 검출이 유니티로, MouseEvent 있습니까?

아니요. Btw 원하는 경우 단일 입력란 안에 마우스 입력 감지를 랩핑하고 다른 클래스가 등록 할 수있는 이벤트를 노출 할 수 있습니다. 같은 뭔가 : 같이 진술

public class MouseInputHandler : MonoBehavior 
{ 
    public event Action<Vector2> MousePressed; 
    public event Action<Vector2> MouseMoved; 
    ... 

    void Update() 
    { 
    if (Input.GetMouseButton(0)) 
    { 
     MousePressed(Input.mousePosition); 
     ... 
    } 
    } 

} 
1

, 당신은, 유니티 폴링 이벤트의 관점에서 당신을 위해 처리 성능에 민감한 코드 실행을 설정하기 위해 내부적으로 '마법을'할 주요 문제없이 사용할 수 있습니다. 결국 현대 게임 엔진의 아름다움입니다. 일반적으로 마우스 클릭 감지와 같은 일반적인 기능을 해킹 할 필요는 없습니다.

그러나 기본 Update()를 사용하지 않으려면 CoRoutine을 만들면 좋을 것입니다. Unity coroutine은 멀티 스레드가 아니므로 결국에는 어쨌든 모든 것이 기다려야합니다.