zoukankan      html  css  js  c++  java
  • Unity2D 里的场景缩放实现

        闲时以 Unity2D 练手时想实现端游里的场景缩放功能,而网上的代码几乎全是 3D 场景缩放相关,所以我自己编写了个 2D 场景缩放脚本(C#)。

        代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class SceneScaleController : MonoBehaviour {
    
        private float normalCameraSize;
        private float minCameraSize;
        private float maxCameraSize;
    
        private const float cScaleRange = 0.8f;
        private const float cScaleFactor = 0.05f;
    
        private enum SceneScaleType {sstNone, sstShrink, sstEnlarge};
        private SceneScaleType scaleType = SceneScaleType.sstNone;
    
        private enum SceneScaleState {sssNormal, sssShrinked, sstEnlarged};
        private SceneScaleState scaleState = SceneScaleState.sssNormal;
    
        void Start() {
            normalCameraSize = Camera.main.orthographicSize;
            minCameraSize = normalCameraSize - cScaleRange;
            maxCameraSize = normalCameraSize + cScaleRange;
        }
    
        void Update() {
            if (scaleType == SceneScaleType.sstNone) {
                float factor = Input.GetAxis("Mouse ScrollWheel");
                if ((factor > 0) && (scaleState != SceneScaleState.sssShrinked)) {
                    scaleType = SceneScaleType.sstShrink;
                } else if ((factor < 0) && (scaleState != SceneScaleState.sstEnlarged)) {
                    scaleType = SceneScaleType.sstEnlarge;
                }
            } else if (scaleType == SceneScaleType.sstEnlarge) {
                float sz = Camera.main.orthographicSize;
                sz += cScaleFactor;
    
                if (scaleState == SceneScaleState.sssNormal) {
                    if (sz >= maxCameraSize) {
                        sz = maxCameraSize;
                        scaleType = SceneScaleType.sstNone;
                        scaleState = SceneScaleState.sstEnlarged;
                    }
                    Camera.main.orthographicSize = sz;
                } else if (scaleState == SceneScaleState.sssShrinked) {
                    if (sz >= normalCameraSize) {
                        sz = normalCameraSize;
                        scaleType = SceneScaleType.sstNone;
                        scaleState = SceneScaleState.sssNormal;
                    }
                    Camera.main.orthographicSize = sz;
                }
            } else if (scaleType == SceneScaleType.sstShrink) {
                float sz = Camera.main.orthographicSize;
                sz -= cScaleFactor;
    
                if (scaleState == SceneScaleState.sssNormal) {
                    if (sz <= minCameraSize) {
                        sz = minCameraSize;
                        scaleType = SceneScaleType.sstNone;
                        scaleState = SceneScaleState.sssShrinked;
                    }
                    Camera.main.orthographicSize = sz;
                } else if (scaleState == SceneScaleState.sstEnlarged) {
                    if (sz <= normalCameraSize) {
                        sz = normalCameraSize;
                        scaleType = SceneScaleType.sstNone;
                        scaleState = SceneScaleState.sssNormal;
                    }
                    Camera.main.orthographicSize = sz;
                }
            }
        }
    }

        将脚本挂到 Main Camera 上,滚动鼠标滚轮,场景即发生缩放了。

  • 相关阅读:
    查看linux版本的三种常用方法
    CentOS和Redhat发行版linux内核版本的对应关系
    swift的异常处理:本质是错误信息的传递方式
    构建法则第一条:有什么材料做什么饭
    待解决问题 代码阅读
    iOS: 聊聊 Designated Initializer(指定初始化函数):NS_DESIGNATED_INITIALIZER
    整合与构建的能力是创造性思维的重要体现
    iOS网络缓存的系统实现是一个烂尾工程
    (动态)代理于HOOK的区别于关系
    iOS 网络缓存总结
  • 原文地址:https://www.cnblogs.com/ecofast/p/4224041.html
Copyright © 2011-2022 走看看