CocosCreator之误删资源错误

推荐阅读:

最近用CocosCreator总是遇到一个错误——library下的某个json找不到,这个错误原因一般都是你误删了资源,在cocos中,每个资源都对应一个id,因此我们在使用过程中应该避免删除资源,那么当你误删了资源后,会出现类似下面的错误:
在这里插入图片描述
这时候该怎么解决呢???
(1)最简单的方法就是找到你误删的资源所在的文件夹,然后Ctrl+Z,撤回删除的操作。
(2)关闭引擎,再打开引擎。如果你幸运的话,错误就消失了,如果不幸的话,那你的使用方法(1)了。

import { _decorator, Component, Node, Input, EventTouch, Vec3, UITransform } from 'cc'; const { ccclass, property } = _decorator; @ccclass('yaogan') export class yaogan extends Component { @property(Node) stick: Node | null = null; @property max_R: number = 100; @property min_R: number = 20; public dir: Vec3 = new Vec3(0, 0, 0); onLoad() { if (this.stick) { this.stick.setPosition(new Vec3(0, 0, 0)); // 3.x使用Vec3坐标 // 触屏事件监听(3.x事件类型从Input获取) this.stick.on(Input.EventType.TOUCH_MOVE, this.on_stick_move, this); this.stick.on(Input.EventType.TOUCH_END, this.on_stick_end, this); this.stick.on(Input.EventType.TOUCH_CANCEL, this.on_stick_end, this); } } // 参数类型改为EventTouch on_stick_move(event: EventTouch) { if (!this.stick) return; const screenPos = event.touch.getLocation(); const uiTransform = this.node.getComponent(UITransform); if (!uiTransform) return; const pos = uiTransform.convertToNodeSpaceAR(new Vec3(screenPos.x, screenPos.y, 0)); //this.stick.setPosition(pos); const len: number = pos.length(); if ( len <= this.min_R ) { this.stick.setPosition(pos); return; } this.dir.x = pos.x / len; this.dir.y = pos.y / len; if ( len > this.max_R ){ pos.x = pos.x * this.max_R / len; pos.y = pos.y * this.max_R / len; } this.stick.setPosition(pos); } on_stick_end() { this.dir = new Vec3(0, 0, 0); if (this.stick) { this.stick.setPosition(new Vec3(0, 0, 0)); // 重置为Vec3原点 } } start() { // 保留空方法避免报错 } }为什么这段代码的检测鼠标移动行为放在onload而不是start里呢?
最新发布
03-16
<think>嗯,用户问为什么这段代码的触屏事件监听放在onLoad而不是start里。我需要回忆一下Cocos Creator的生命周期函数。之前用户已经问过update、start和onLoad的区别,所以现在他们可能对具体代码中的选择有疑问。 首先,onLoad是在组件初始化时调用,而start是在第一次update之前调用。根据之前的回答,onLoad更早执行,适合初始化变量和组件引用。而start适合需要其他组件初始化的逻辑。 在这段代码里,事件监听是在onLoad里绑定的。可能的原因有几个:首先,事件监听需要在组件初始化后立即设置,确保在节点激活后能立即响应输入。如果放在start里,可能在第一次update之前才会绑定,但如果有其他脚本在onLoad里做了某些操作,可能在start之前需要事件已经生效。不过,根据生命周期顺序,onLoad先于start执行,所以放在onLoad可以更早绑定事件,确保任何在start里的操作可能触发的事件都能被捕获。 另外,stick节点作为属性被装饰器标记,可能在onLoad时已经可用,所以直接在这里绑定是安全的。如果在start里,可能不会有问题,但作者可能遵循最佳实践,将初始化代码放在onLoad里,这样结构更清晰。同时,如果组件需要在onLoad阶段就准备好事件监听,比如某些依赖事件触发的初始化逻辑,就必须在onLoad里设置。 还有,用户可能担心为什么start方法留空。根据代码注释,是为了避免报错,可能Cocos Creator的组件需要有start方法存在,即使不需要执行任何操作。不过具体原因可能需要查看框架的要求,但作者可能只是保留了一个空方法以备后续扩展。 总结来说,放在onLoad是为了尽早绑定事件,确保组件初始化完成后立即能够响应用户输入,而start可能用于其他需要依赖初始化的逻辑,但这里不需要,所以事件监听放在onLoad更合适。</think>在 Cocos Creator 中,将**触屏事件监听逻辑放在 `onLoad` 而不是 `start`** 中的原因与生命周期函数的调用顺序和特性密切相关。以下是详细解释: --- ### **1. 生命周期顺序** - **`onLoad`**:在节点**首次激活时立即执行**(组件初始化完成后)。 - **`start`**:在节点**第一次激活后的下一帧执行**(在第一次 `update` 前)。 - **关键区别**:`onLoad` 比 `start` **更早执行**,确保事件监听能第一时间生效。 --- ### **2. 为什么要放在 `onLoad` 中?** #### **原因 1:确保事件尽早绑定** - 若在 `start` 中绑定事件监听: - 节点激活后到 `start` 执行前(即第一帧期间),用户操作可能无法被捕获。 - 例如:用户可能在游戏启动瞬间点击摇杆,但事件监听尚未绑定,导致输入丢失。 - **`onLoad` 的优势**: - 在节点初始化完成后**立刻绑定事件**,确保从节点激活的第一时间就能响应输入。 #### **原因 2:避免依赖未初始化的组件** - 如果 `stick` 节点或 `UITransform` 组件未完全初始化: - 在 `start` 中绑定事件可能导致空引用错误(例如 `this.stick` 为 `null`)。 - **`onLoad` 的优势**: - Cocos Creator 保证在 `onLoad` 阶段,组件的 `@property` 属性(如 `this.stick`)和依赖的组件(如 `UITransform`)**已完全初始化**,因此在此处绑定事件更安全。 #### **原因 3:代码逻辑的典型实践** - **`onLoad` 的典型用途**: - 初始化变量、绑定事件监听、获取组件引用。 - **`start` 的典型用途**: - 处理需要依赖其他组件初始化完成的逻辑(例如其他节点的 `onLoad` 已执行完毕)。 --- ### **3. 为什么不放在 `start` 中?** 假设将事件监听移到 `start`: ```typescript start() { this.stick.on(Input.EventType.TOUCH_MOVE, this.on_stick_move, this); } ``` - **潜在风险**: - 若用户在第一帧期间触摸屏幕,事件会因监听未绑定而丢失。 - 若 `stick` 节点或 `UITransform` 未初始化完成(例如异步加载资源),可能抛出错误。 --- ### **4. 代码中的其他细节** - **`start() {}` 为何留空**: - 如果组件不需要 `start` 逻辑,保留空方法是为了避免 Cocos Creator 因缺失生命周期函数而警告(某些旧版本或特定配置可能要求显式声明)。 - 最佳实践是移除无用方法,但此处可能是预留扩展或防止误删。 --- ### **总结对比表** | 特性 | `onLoad` 中绑定事件监听 | `start` 中绑定事件监听 | |---------------------|--------------------------------------|------------------------------------| | **执行时机** | 节点初始化完成后立刻执行 | 节点激活后的下一帧执行 | | **输入响应及时性** | 第一时间响应(无延迟) | 可能丢失第一帧的输入 | | **初始化安全性** | 确保 `@property` 属性已初始化 | 需手动确保依赖项已初始化 | | **典型场景** | 初始化事件、变量、组件引用 | 依赖其他组件初始化后的逻辑 | --- ### **最佳实践建议** 1. **事件监听、组件引用、变量初始化** ➔ 优先放在 `onLoad`。 2. **依赖其他组件的逻辑** ➔ 放在 `start`。 3. **持续性更新逻辑** ➔ 放在 `update`。 此代码将事件监听放在 `onLoad` 中,是符合 Cocos Creator 生命周期规范的合理设计。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值