用现在的3.X版本只能强制用typescpirte,但是创建2D项目instantiate,无法实例化2D项目的预制体!

如题那么请问做2D项目是不是还是要切回到2.X版本啊,那这个3.X版本的编辑器不是不能向下兼容。既然不能为什么不单独踢出来弄成另外的编辑器!下面是我复制的官方的代码,只能实例化3D项目的预制体,2D项目没有任何作用!
import { _decorator, Component, Prefab, instantiate, director } from ‘cc’;

const { ccclass, property } = _decorator;

@ccclass(“test”)

export class test extends Component {

@property({type:Prefab})

private target: Prefab = null;

start(){

    let scene = director.getScene();

    let node = instantiate(this.target);

    scene.addChild(node);

    node.setPosition(0,0,0);

}

}

的确是文档写得不够清楚

不过你直接把这个预置体拉到场景上就会发现问题了

是因为你直接在scene 去加入节点 没有画布 会看不到内容

我不同意你的说法,这个跟文档没关系,锅应该是addChild这个函数不够强大和智能,人家的写法是没任何毛病的,有毛病的是官方的api(addChild)

不能完全这么说,万一用这个功能的人就是不想生成Canvas呢,毕竟操作逻辑上就是不应该生成的
反过来我还觉得每次在编辑器给无canvas节点加入2d相关节点他还自动生成canvas很麻烦呢,一个好好的2d预制体,在上面创建一个label节点,就给你生成个Canvas,还得手动删除,笨的不行 :2:

1赞

那就看你怎么理解addChild的add了,如果如你所说的,那所有节点都要添加一个函数叫做addChildOnCanvas,如若不然,岂不是每次addChild都要来一下add into Canvas?
细分的api有好处,集成的多功能api也有好处,2者都提供也是个不错的选择。
不过单纯的scene虽然说也是一个node类型,但是却没渲染到canvas,这种类型上面的分类还是不大友好,无论从设计上面还是从使用者层面来说,还不如单独抽离出来一个nodeOnCanvas类型和一个node节点类型(NotOnCavans)呢~~

我找到原因了,3D和2D是有一些区别,官方是没有说清楚,但是我通过console.log()打印出父级就知道了,要把代码稍微做一点儿变动。

对头,如果2D直接用这套代码 会发现 父级 直接是windows,所以 要修改父级是谁来添加这个预制体就对了

发下核心代码我看下

inistanpai(titl:string,index:number){

    let tempcard = instantiate(this.target);

   

    this.node.addChild(tempcard);

    let card= tempcard.getComponent('card') as card;

     card.title=titl;

    tempcard.setPosition((index-8)*20,0,0);

}

这里的父级是 this.node,不能getSence

1赞

…,好吧,你这个算是绕过去了,并不是解决这个scene.addChild的问题

我是直接另写了addChildEx来用
有参考之前

2.x升级3.3的完整教程 (保留js文件)

的内容

cc.Scene.prototype.addChildEx = function (child:cc.Node, zIndex?:number, name?:string) {
            if(cc.isValid(child)){
                if (typeof name != undefined && name) {
                    child.name = name;
                }
                if( this.layer ){
                    child.layer = this.layer;
                } else{
                    child.layer = 1;
                }
                let canvas = child.getComponent(cc.Canvas);
                if(!canvas){
                    canvas = child.addComponent(cc.Canvas);
                }
                this.addChild(child);
                if (typeof zIndex != undefined ) {
                    child.zIndex = zIndex;
                }
            }
        }

我现在遇到一个新问题,就是调用PHP接口,如何做到跨越后让上下文一致的问题的,举个简单例子。接口1.php 实现用户登录,并保存登录后的session信息,接口2.php 通过获取session(‘uid’),去查询用户的积分数量。因为调用2个接口的XMLHttpRequest 的COOKIE 不同,所以导致第二个接口是获取不到session(‘uid’)的。本来想的解决办法是在1.php中返回一个全局sessionid,以供后面其他接口设置请求的header来用,最后解决这个问题。谁知道,他不准设置header 的COOKIE。那么请问 你们在做这种访问多个接口的东西时,是如何解决跨越后实现多个接口访问UID 一致的问题的呢

唯一想到的办法就是把sessionid当参数 ,后面所有要用到该用户相关的接口 都带上这个了。实在是不够优雅啊