[Unity Tips] 조준 조준경 확대 효과를 얻으려면 세 가지 방법을 사용하세요

최종 효과 비교

여기에 이미지 설명을 삽입하세요.

머리말

많은 슈팅 게임에서 조준경의 줌 효과는 슈팅 정확도와 게임 경험을 향상시키는 중요한 부분입니다. 널리 사용되는 게임 개발 엔진인 Unity는 조준 조준의 확대/축소 효과를 얻을 수 있는 다양한 방법을 제공합니다. 이 기사에서는 세 가지 일반적인 구현 방법을 소개하고 각각의 장점과 단점을 논의합니다.

먼저 카메라의 화각을 조정하여 확대 줌 효과를 얻는 방법을 소개합니다. 둘째, 셰이더를 사용하여 조준경의 확대 효과를 얻는 방법과 렌더 텍스처를 사용하여 확대/축소 효과를 시뮬레이션하는 방법에 대해 설명합니다. 각 방법에는 고유한 적용 시나리오와 적용 가능성이 있습니다. 이 기사에서는 개발자가 자신의 필요에 따라 적절한 구현 방법을 선택하는 데 도움이 되도록 이 세 가지 방법의 구체적인 구현 및 사용 시나리오를 자세히 살펴보겠습니다.

초보자이든 숙련된 개발자이든 이 문서에서는 Unity의 시력 확대/축소 효과를 더 잘 이해하고 사용하는 데 도움이 되는 포괄적인 튜토리얼과 샘플 코드를 제공합니다. 이러한 흥미로운 기술을 살펴보겠습니다!

첫 번째 방법

카메라 FOV 값 조정

public class RifleScopeZoom : MonoBehaviour
{
    
    
    [SerializeField] private Camera playerCamera;
    [SerializeField] private float zoomSpeed = 10f;
    [SerializeField] private float minFOV = 20f;
    [SerializeField] private float maxFOV = 60f;

    private void Update()
    {
    
    
        // 获取滚轮滑动的值
        float scrollValue = Input.GetAxis("Mouse ScrollWheel");
        
        // 根据滚轮滑动的值调整 FOV
        playerCamera.fieldOfView -= scrollValue * zoomSpeed;
        
        // 限制 FOV 的范围在最小值和最大值之间
        playerCamera.fieldOfView = Mathf.Clamp(playerCamera.fieldOfView, minFOV, maxFOV);
    }
}

이것이 첫 번째 구현 방법
여기에 이미지 설명을 삽입하세요.
입니다. 보시다시피 매우 간단합니다. 기본 카메라 매개변수만 조정하면 됩니다. 이 방법의 장점은 성능이 좋다는 것입니다. 새로운 셰이더나 다른 카메라가 필요하지 않습니다. 하지만 카메라 FOV만 조정하면 되는데, 보기에 좋지 않다는 단점이 있습니다.이상적으로는 스코프에 보이는 물체만 확대하고 싶지만 이제는 전체 사진이 확대됩니다.

또한 스코프 모델이 속이 비어 있고 투명하지 않은 경우 저격총 스코프와 같이 이 방법을 사용할 수 없습니다. 아래 예에서는 스코프만 제거할 수 있습니다.
여기에 이미지 설명을 삽입하세요.

방법 2

두 번째 방법의 경우 셰이더를 사용하여 개체 뒤의 그림을 확대해야 합니다.

1. URP 환경 생성

이해가 되지 않는다면 URP 환경 구성 방법을 알려주는 이전 기사인 셰이더 그래프를 사용하여 Animal Crossing: Friends의 세계 굴곡 효과 달성하기를 읽어보세요.

2. 배치 Universal Render Pipeline Asset

깊이 버퍼와 컬러 버퍼 정보를 얻기 위해 실험에서는 Scene Depth와 Scene Color 노드를 사용했기 때문에 다음과 같이 유니버설 렌더 파이프라인 에셋에서 Depth Texture와 Opaque Texture를 확인해야 합니다.
여기에 이미지 설명을 삽입하세요.

3. 여기서는 새로운 매트 ShaderGraph를 만듭니다.

여기에 이미지 설명을 삽입하세요.

4. 메인 이미지 구성

거울은 투명하기 때문에 메인 그래프의 그래프 세팅에서 Surface Type 속성을 Transparent로 설정해야 합니다.
여기에 이미지 설명을 삽입하세요.

4. 새 재질을 생성하고 마운트합니다.

이 효과를 얻기 위해 스코프에 공을 배치하고 매우 평평하게 만들고 거울 효과를 시뮬레이션한 다음 전면 ShaderGraph로 재질을 바인딩했습니다.
여기에 이미지 설명을 삽입하세요.

5. 다음은 ShaderGraph의 연결도입니다.

여기에 이미지 설명을 삽입하세요.
여기서는 Scene Color 노드를 사용하여 객체 뒤의 장면 색상을 출력하고 Tilling 및 offset 노드를 사용하여 Tilling 값을 수정하여 증폭을 달성한 다음 객체 화면 좌표를 사용합니다.이것이 가장 복잡한 지점인 ObjectScreenPosition입니다. 이 매개변수는 그에 따라 조정되어야 하며 범위는 이동하고 지속적으로 수정됩니다.

6. 범위가 이동함에 따라 ObjectScreenPosition이 지속적으로 수정되도록 제어하는 ​​새 스크립트를 추가했습니다.

여기에 또 다른 스크립트인 RifleScopeShaderScreenPos가 있습니다. 이 스크립트의 기능은 객체의 세계 좌표를 화면 좌표로 변환한 다음 이를 셰이더에 입력하는 것이므로 이 셰이더는 모든 화면을 확대하지 않고 화면에 있는 항목만 확대합니다. 범위.

public class RifleScopeShaderScreenPos : MonoBehaviour
{
    
    
    // Shader 材质
    [SerializeField] private Material material;

    private void Update()
    {
    
    
        // 获取物体在屏幕上的像素坐标
        Vector2 screenPixels = Camera.main.WorldToScreenPoint(transform.position);
        // 将像素坐标转换为 0-1 的范围
        screenPixels = new Vector2(screenPixels.x / Screen.width, screenPixels.y / Screen.height);
        // 将物体的屏幕坐标传递给 Shader
        material.SetVector("_ObjectScreenPosition", screenPixels);
    }
}

6. 스크롤 휠 확대/축소 효과를 실현하기 위해 새로운 스크립트 control_ZoomAmount를 추가했습니다.

public class RifleScopeZoomMaterial : MonoBehaviour
{
    
    
    [SerializeField] private float zoomSpeed = 10f;
    [SerializeField] private float min  = 0f;
    [SerializeField] private float max = 1f;
    [SerializeField] private Material zoomMaterial;

    private void Update()
    {
    
    
        // 获取滚轮滑动的值
        float scrollValue = Input.GetAxis("Mouse ScrollWheel");
        scrollValue = zoomMaterial.GetFloat("_ZoomAmount") + scrollValue;

        // 限制的范围在最小值和最大值之间
        scrollValue = Mathf.Clamp(scrollValue, min, max);
        
        zoomMaterial.SetFloat("_ZoomAmount", scrollValue);
    }
}

여기에 이미지 설명을 삽입하세요.
이전 방법에 비해 눈에 보이는 것만 확대하므로 시야 밖의 것은 변하지 않는다는 장점이 있고, 또 다른 장점은 다음 방법에 비해 성능 집약적이지 않다는 점이다. 셰이더와 카메라는 한 번만 렌더링합니다. 물론 단점도 있습니다. 한 가지 잠재적인 문제는 확대하면 사진이 이렇게 보일 것이라는 점입니다.
여기에 이미지 설명을 삽입하세요.
배율이 그다지 높지 않으면 사진이 괜찮지만 확대하면 사진이 나옵니다. 모자이크 사진을 많이 얻을수록 이는 사진의 해상도와 관련이 있습니다. 셰이더는 해상도를 변경하지 않고 사진을 확대하기 때문에 사진이 클수록 모자이크가 더 뚜렷해집니다. 배율이 너무 크면 좋은 방법이고, 이전과 같은 문제가 있는데, 스코프 모델이 속이 비어 있고 투명하지 않으면 이 방법이 적합하지 않을 수 있습니다.

세 번째 방법

우리는 본질적으로 카메라 이미지를 텍스처에 렌더링하는 렌더링 텍스처 기능을 사용해야 합니다.

1. 새로운 렌더링 카메라 추가

따라서 새 카메라가 필요하고 앞으로 드래그하면 이제 스코프 앞이나 배럴에 직접 드래그한 다음 FOV를 아래로 당겨 확대할 수 있습니다.
여기에 이미지 설명을 삽입하세요.

2. 렌더 텍스처 생성

또 다른 렌더링 텍스처를 만들어 보겠습니다. 여기서는 주로 크기를 설정합니다. 이는 주로 플레이어의 해상도와 화면에 표시되는 조준경의 크기에 따라 달라지며 여기서는 1024*1024이면 거의 충분합니다.

여기에 이미지 설명을 삽입하세요.
이런 식으로 설정하고 카메라가 렌더링된 이미지를 이 텍스처로 출력하도록 했으며,
여기에 이미지 설명을 삽입하세요.
이렇게 하면 카메라 이미지가 이 텍스처로 렌더링된 것을 볼 수 있습니다.
여기에 이미지 설명을 삽입하세요.

3. 렌더링 텍스처 바인딩

다음으로 스코프에 사진을 표시하기 위해 스코프 내부에 쿼드를 직접 배치합니다. 스코프 사진을 얻으려면 렌더링 텍스처만 드래그하면 됩니다.
여기에 이미지 설명을 삽입하세요.
이것이 효과가 있습니다. 확대된 카메라 사진은 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

4. 렌즈 착용 곰팡이 문제 해결

하지만 여전히 작은 문제가 있습니다. 즉, 내 문의 쿼드가 사각형이고 범위가 둥글기 때문에 금형을 통해 약간 보이는 것을 볼 수 있습니다. 매우 간단한 해결책은 여기에서
여기에 이미지 설명을 삽입하세요.
투명도 자르기를 수행하는 것입니다.
여기에 이미지 설명을 삽입하세요.
또한 투명도 자르기 프리팹을 사용하려면 설정 패널로 이동하여 알파 클립을 활성화하세요.
여기에 이미지 설명을 삽입하세요.
작업을 마친 후 여기에서 AlphaClipMask를 클릭하고 투명한 배경이 있는 원형 텍스처를 선택하세요. 작업
여기에 이미지 설명을 삽입하세요.
이 완료되면 마스크 외부의 텍스처가 잘려 중간 프레임만 유지됩니다.
여기에 이미지 설명을 삽입하세요.

5. 확대 효과를 얻기 위한 스크립트 제어

마지막 단계는 스크립트를 처리하는 것입니다. 우리가 해야 할 일은 렌더링 텍스처 카메라의 FOV를 조정하는 것뿐입니다. 이전 코드를 재사용할 수 있습니다. 카메라를 기본 카메라 대신 렌더링 카메라로 변경하는 것을 잊지 마세요.

public class RifleScopeZoom : MonoBehaviour
{
    
    
    [SerializeField] private Camera playerCamera;
    [SerializeField] private float zoomSpeed = 10f;
    [SerializeField] private float minFOV = 20f;
    [SerializeField] private float maxFOV = 60f;

    private void Update()
    {
    
    
        // 获取滚轮滑动的值
        float scrollValue = Input.GetAxis("Mouse ScrollWheel");
        
        // 根据滚轮滑动的值调整 FOV
        playerCamera.fieldOfView -= scrollValue * zoomSpeed;
        
        // 限制 FOV 的范围在最小值和最大值之间
        playerCamera.fieldOfView = Mathf.Clamp(playerCamera.fieldOfView, minFOV, maxFOV);
    }
}

효과
여기에 이미지 설명을 삽입하세요.
이전 방법에 비해 모자이크 문제가 없는 것을 볼 수 있듯이 원하는 곳을 확대할 수 있으며, 이 방법은 총을 들지 않아도 스코프의 그림이 바뀌는 흥미로운 특징이 있습니다
여기에 이미지 설명을 삽입하세요.
. 장점은 다른 카메라를 사용하고 있기 때문에 다양한 효과를 사용할 수 있고, 后处理기본 카메라에 피사계 심도 효과를 추가할 수 있으며, 렌더 텍스처가 카메라에 너무 가깝기 때문에 몇 가지 흥미로운 작업을 수행할 수 있다는 것입니다. 흐려지지 않고 바깥의 모든 것이 흐려집니다.
여기에 이미지 설명을 삽입하세요.

여기에 이미지 설명을 삽입하세요.
개인적으로는 이게 제일 나은거 같습니다.스코프 밖의 영상은 흐릿하지만 내부의 영상은 여전히 ​​선명합니다.원하시면 거울을 앞으로 이동시켜 다른 후처리 효과를 사용할 수 있습니다.실현하거나 거울 밖의 영상을 볼 수 镜内热成像있습니다 夜视效果. 정상으로 유지됩니다.

물론 이 방법에도 큰 문제가 있는데 , 이 방법은 렌더링 텍스처를 사용해 두 번째 카메라의 사진을 표시하는데, 본질적으로 사진이 두 번 렌더링된다는 점이다 缺点. 性能问题큰 문제가 아닐 수도 있지만, 모바일 게임이라면 큰 문제가 될 수도 있지만, 성능 비용을 감당할 수 있다면 이 방법이 가장 좋습니다.

요약하다

좋아, 당신은 스코프 확대의 세 가지 방법을 배웠습니다. 첫 번째 방법은 性能优先필요가 있거나 그것을 달성할 방법을 찾고자 하는 最简单사람들 에게 적합합니다. 두 번째 방법 稍优于第一
과 마지막 방법은 最好的瞄具결과를 제공할 것입니다. 사용하기에 적합한 방법을 선택하십시오. 귀하의 응용 프로그램에서 프로젝트에서!
여기에 이미지 설명을 삽입하세요.

참고

【동영상】https://www.youtube.com/watch?v=9g2VqJvWnQI

장미를 선물하고, 향수를 건네보세요! 点赞评论和关注글의 내용이 도움이 되셨다면, 빠른 피드백을 받을 수 있도록 피드백 에 인색하지 마시고 , 여러분의 모든 피드백은 支持제가 계속해서 글을 쓰는 데 가장 큰 원동력이 됩니다. 存在错误물론, 기사에서 내용을 찾으면 更好的解决方法언제든지 댓글을 달고 개인 메시지를 보내주세요!

알겠습니다. 저는 https://xiangyu.blog.csdn.net向宇 입니다.

작은 회사에서 조용히 일하던 개발자가 최근 취미로 Unity를 배우기 시작했습니다. 여가 시간에는 배우면서 녹음하고 공유합니다. 거인의 어깨 위에 서서 선배들의 경험을 통해 배우는 것은 항상 도움이 될 것입니다. 저를 많이 도와주고 영감을 주세요! PHP는 일이고, Unity는 삶입니다! 문제가 발생하면 댓글을 달거나 개인 메시지를 보내주실 수도 있습니다. 일부 문제를 알지 못할 수도 있지만 모든 당사자의 정보를 확인하고 최선의 제안을 제공하도록 노력하겠습니다. 더 많은 도움을 드리고 싶습니다. 프로그래밍을 배우고 싶은 사람들, 서로 격려해주세요~

여기에 이미지 설명을 삽입하세요.

추천

출처blog.csdn.net/qq_36303853/article/details/135039078