温馨提醒:即刻转去Unity3d
精灵不显示:
不要在空节点下直接添加组件
正确的做法是:在空节点(Node)上右键创建一个精灵才会给看到 或者直接拖曳一个图片放到场景编辑器中也可
cocos creator 3.x图片动态加载
不知道是这文档抽象还是我阅读理解有问题 居然百度了三个小时没搜到哪里错了 后面在读了一遍才知道他是啥意思
这里是引用
加载 SpriteFrame 或 Texture2D
图片设置为 sprite-frame 或 texture 或其他图片类型后,将会在 资源管理器 中生成一个对应类型的资源。但如果直接加载 test assets/image,得到的类型将会是 ImageAsset。你必须指定路径到具体的子资源,才能加载到图片生成的 SpriteFrame:
// 加载 SpriteFrame,image 是 ImageAsset,spriteFrame 是 image/spriteFrame,texture 是 image/textureresources.load("test assets/image/spriteFrame", SpriteFrame, (err, spriteFrame) => {this.node.getComponent(Sprite).spriteFrame = spriteFrame;});
// 加载 SpriteFrame,image 是 ImageAsset,spriteFrame 是 image/spriteFrame,texture 是 image/texture
他的意思是你在你读到图片路径的屁股后面加一句/spriteFrame 获得的就是SpriteFrame的类型
加一句/texture就是texture的类型
我一直以为你他那个“image”是文件夹的意思 给我整无语了
我的图片位置:
我的脚本挂在:
然后代码应该这么写
let self = this;resources.load("test assets/image/ddd/spriteFrame", SpriteFrame, (err, spriteFrame) => {self.node.getComponent(Sprite).spriteFrame = spriteFrame});
物理碰撞
3.x版本和以前不同
物体产生物理碰撞之后,原有的物理碰撞回调没有了
从 v3.0 开始,碰撞体回调需要在开始的时候进行注册,与原先 v2.x 会直接产生回调不同。因此开发者需要在物理回调的脚本中增加对回调函数的注册。例如:
let collider = this.getComponent(Collider2D);if (collider) {// 只在两个碰撞体开始接触时被调用一次collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);// 只在两个碰撞体结束接触时被调用一次collider.on(Contact2DType.END_CONTACT, this.onEndContact, this);// 每次将要处理碰撞体接触逻辑时被调用collider.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);// 每次处理完碰撞体接触逻辑时被调用collider.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);}});
升级之后,物理碰撞分组不见了 目前导入插件还不支持物理碰撞矩阵,因此暂时需要开发者手动设置碰撞矩阵,可在 Creator 主菜单 项目 ->
项目设置 -> 物理 中重新设置。
根据文档
要先在sprite上加上BoxCollider2D和RigidBody2D
并且碰撞双方RigidBody2D都要打开这个碰撞监听属性
代码:
start () {let collider = this.getComponent(Collider2D);if(collider){console.log(1)collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)}}onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {// 只在两个碰撞体开始接触时被调用一次console.log('onBeginContact');}
或者并不用开启RigidBody2D
只需要把项目设置里的这里改成内置的2D物理系统即可
简单的碰撞计算并不需要用到RigidBody2D
人物跟随鼠标移动
需要获取的是getUILocation()并不是 鼠标的getLocation()
start () {input.on(Input.EventType.TOUCH_MOVE,(event)=>{this.node.setWorldPosition(v3(event.getUILocation().x,event.getUILocation().y,0))},this)}
碰撞后节点销毁
必须要延迟一帧 我查了查他那个论坛 好像是说是引擎特色
HitEnemy(self:Collider2D,other:Collider2D){if(other.tag == 0){//延迟一帧this.scheduleOnce(()=>{//敌人销毁other.getComponent(enemyScript).die()//自己销毁self.node.destroy()},0)}}
世界坐标系转局部坐标系
获取碰撞点转坐标系
let col = this.getComponent(Collider2D)col.on(Contact2DType.BEGIN_CONTACT,(self:Collider2D,other:Collider2D,contant:IPhysics2DContact)=>{//世界坐标系//获取坐标点let point = contant.getWorldManifold().points[0]//获取法线let normal =contant.getWorldManifold().normal//转换为canvas下的局部坐标let newpoint = this.node.getParent().getComponent(UITransform).convertToNodeSpaceAR(v3(point.x,point.y,0))//设置this.node.getParent().getChildByName("bird0_2").setPosition(newpoint)console.log(normal)console.log(this.node.getParent().getComponent(UITransform).convertToNodeSpaceAR(v3(normal.x,normal.y,0)))},this)
raycast射线检测
先要把需要检测的物体的刚体(RigitBody2D)和BoxCollider2D都勾上
然后我还发现了 这物理系统的参数估计用的全都是世界坐标系到时候都得从UI坐标系中转出来还有如果报错别急,就先延后一帧试试看,再错就去查文档
onLoad(){//经典延后一帧不然报错this.scheduleOnce(()=>{let phy = PhysicsSystem2D.instance//转换为世界坐标系let newp = this.node.getParent().getComponent(UITransform).convertToWorldSpaceAR(this.node.getPosition())//然后就能检测到了let res = phy.raycast(newp,v2(newp.x+200,newp.y),ERaycast2DType.Closest) console.log(res)}) }