Unity 实现屏幕抖动效果(通过Camera Viewport Rect)

本文介绍了一种在Unity中实现屏幕抖动效果的方法,主要通过修改摄像机的ViewportRect属性来达到震动效果。该方法适用于游戏开发中增强用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现屏幕抖动其实是实现相机Camera的抖动,通过修改Viewport Rect属性改变屏幕位置

以下是百度到的代码:

public class ShakeCamera : MonoBehaviour {

    private Camera mainCamera;
    //震动标志位
    public bool isShakeCamera = false;
    //震动幅度
    public float shakeLevel = 3f;
    //震动时间
    public float setShakeTime = 0.2f;
    //震动的FPS
    public float shakeFps = 45f;

    private float fps;
    private float shakeTime = 0.0f;
    private float frameTime = 0.0f;
    private float shakeDelta = 0.005f;

    void Awake()
    {
        //获取Camera组件
        mainCamera = GetComponent<Camera>();
    }

    void Start () {
        shakeTime = setShakeTime;
        fps = shakeFps;
        frameTime = 0.03f;
        shakeDelta = 0.005f;
	}
	
	void Update () {
        if (isShakeCamera)
        {
            if (shakeTime > 0)
            {
                shakeTime -= Time.deltaTime;
                if (shakeTime <= 0)
                {
                    mainCamera.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
                    isShakeCamera = false;
                    shakeTime = setShakeTime;
                    fps = shakeFps;
                    frameTime = 0.03f;
                    shakeDelta = 0.005f;
                }
                else
                {
                    frameTime += Time.deltaTime;
                    if(frameTime>1.0/fps)
                    {
                        frameTime = 0;
                        mainCamera.rect = new Rect(shakeDelta * (-1.0f + shakeLevel * Random.value), 
                            shakeDelta * (-1.0f + shakeLevel * Random.value), 1.0f, 1.0f);
                    }
                }
            }
        }
	}

    public void Shake()
    {
        isShakeCamera = true;
    }
}

但是在Update方法里Camera的Rect的修改,以及上面定义的private float fps,shakeDelta,shakeLevel的作用不是很理解

<think>我们正在讨论Unity的2D通用模板中的三个特定文件/对象:MainCamera、GlobalLight2D和EventSystem。下面将分别解释它们的作用和功能。 ### 1. MainCamera - **文件类型**:场景中的游戏对象(GameObject) - **作用**: - 负责渲染游戏画面到屏幕上,是玩家观察游戏世界的窗口。 - 在2D游戏中通常采用正交投影(Orthographic Projection),没有透视效果,所有物体大小不受距离影响。 - **关键组件**: - `Camera`:核心组件,控制视口大小、背景颜色等。 - `Audio Listener`:用于接收场景中的音频(通常只需一个)。 ### 2. Global Light 2D - **文件类型**:游戏对象(GameObject)上的组件 - **作用**: - 提供全局性的2D光照效果,影响场景中所有接受光照的2D物体。 - 可以设置环境光颜色和强度,模拟昼夜变化或氛围效果。 - **配置位置**: ```plaintext GameObject → Light → Global Light 2D ``` - **重要属性**: - `Light Intensity`:光照强度(0-1) - `Light Color`:全局光照颜色 ### 3. EventSystem - **文件类型**:场景中的独立游戏对象(GameObject) - **作用**: - 处理UI输入事件的系统核心,管理鼠标、触摸、键盘等与UI元素的交互。 - 协调`Input Module`(如`Standalone Input Module`)和`Raycaster`(如`Graphic Raycaster`)。 - **关键组件**: - `Event System`:主控制器,处理输入事件分发。 - `Standalone Input Module`:专门处理键鼠/手柄输入。 - 可选`Touch Input Module`:移动端触摸支持。 ### 三者在2D项目中的协作关系 ```mermaid graph TD A[MainCamera] -->|渲染画面| B[玩家看到的2D世界] C[GlobalLight2D] -->|全局光照| A C -->|影响所有Sprite| D[2D物体] E[EventSystem] -->|检测UI操作| F[按钮/滑块等UI元素] ``` ### 常见问题处理 1. **MainCamera黑屏问题**: - 检查`Camera`组件的`Clear Flags`是否设置为`Solid Color` - 确认`Culling Mask`包含需要渲染的图层 2. **GlobalLight2D无效**: - 确保2D物体有`Light 2D`组件并设置`Light Type`为`Global` - 检查光照层(Light Layers)匹配 3. **EventSystem无响应**: - 确认存在`Standalone Input Module` - 检查Canvas的`Render Mode`是否遮挡事件 > ⚠️ 注意:Universal 2D模板默认包含这三者,删除EventSystem会导致UI交互失效。 §§相关问题§§ 1. 如何为2D游戏中的不同场景设置不同的全局光照? 2. MainCamera的正交大小(Orthographic Size)如何影响2D游戏画面? 3. EventSystem如何处理多个输入设备(如同时支持键鼠和触摸屏)? 4. Global Light 2D能否与Unity的2D阴影系统协同工作? 5. 在多人游戏场景中是否需要多个EventSystem实例?</think>### Unity 2D通用模板核心组件解析 #### 1. **MainCamera** - **文件类型**:场景中的游戏对象(GameObject) - **核心组件**:`Camera`组件 - **作用**: - 定义玩家视角的渲染范围(通过`Viewport Rect`) - 控制2D渲染模式(`Orthographic`正交投影) - 设置背景色和剔除遮罩(`Culling Mask`) - **2D特定设置**: ```csharp camera.orthographic = true; // 启用2D正交模式 camera.orthographicSize = 5; // 控制可视范围高度 ``` #### 2. **Global Light 2D** - **文件类型**:附加在游戏对象上的组件(`Light 2D`组件) - **作用**: - 提供全局环境光照(相当于2D世界的太阳/月亮) - 影响所有带`Light 2D`接收器的精灵(Sprite Renderer) - 控制场景整体明暗和色调 - **关键属性**: - **Light Type**:设置为`Global` - **Intensity**:光照强度(0-1) - **Color**:光源颜色(暖色/冷色调) - **Blend Style**:光照混合模式(Additive/Multiply) #### 3. **EventSystem** - **文件类型**:场景中的独立游戏对象 - **核心组件**: - `Event System`:输入事件处理器 - `Standalone Input Module`:键鼠/手柄输入支持 - 可选`Touch Input Module`:触摸屏支持 - **作用**: - 管理所有UI交互事件(点击/拖拽/选择) - 处理输入设备自动切换(键鼠→手柄→触摸) - 控制UI导航系统(Tab键切换焦点) - **工作流程**: ```mermaid graph LR A[输入设备] --> B[EventSystem] B --> C{事件类型} C -->|点击| D[UI Button] C -->|拖拽| E[Scroll Rect] C -->|选择| F[Input Field] ``` ### 三者在2D项目中的协同关系 ```plaintext ┌─────────────┐ ┌───────────────┐ ┌─────────────┐ │ GlobalLight │──光照→│ Sprite渲染 │←显示─│ MainCamera │ └─────────────┘ └───────┬───────┘ └─────────────┘ │ │ UI交互 ▼ ┌─────────────────┐ │ EventSystem │ │ (处理按钮/滑块等) │ └─────────────────┘ ``` ### 实际应用注意事项 1. **MainCamera调整**: - 正交大小(Orthographic Size)需匹配场景尺寸 - 使用`Pixel Perfect Camera`组件消除像素抖动 2. **Global Light 2D优化**: ```csharp // 动态修改光照示例 void Update() { Light2D.globalLightIntensity = Mathf.PingPong(Time.time, 1); } ``` 3. **EventSystem扩展**: - 添加`Physics 2D Raycaster`实现精灵点击检测 - 通过`Event Trigger`组件创建自定义交互 > ⚠️ 重要提示:删除EventSystem会导致所有UI交互失效;禁用GlobalLight2D会使场景变暗;MainCamera缺失则无画面渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值