【cocos creator】2.4.x实现简单3d功能,点击选中,旋转,材质修改,透明材质

07-13 1797阅读

demo下载:(待审核)

【cocos creator】2.4.x实现简单3d功能,点击选中,旋转,材质修改,透明材质
(图片来源网络,侵删)

https://download.csdn.net/download/K86338236/89527924

const { ccclass, property } = cc._decorator;
const enum box_color {
    NORMAL = 0,
    DASHED_LINE = 1,//虚线
    TRANSLUCENT = 2,//半透明
}
@ccclass
export default class main extends cc.Component {
    @property(cc.Node)
    boxNode: cc.Node = null;
    @property(cc.Node)
    layerNode: cc.Node = null;
    /**层的父节点 */
    @property(cc.Node)
    layerRootNode: cc.Node = null;
    /**点击检测射线 */
    @property(cc.Node)
    touchNode: cc.Node = null;
    /**普通的颜色 */
    @property([cc.Material])
    changeMat: cc.Material[] = [];
    /**普通颜色第二层,半透明用 */
    @property([cc.Material])
    changeMat2: cc.Material[] = [];
    /**选择状态的颜色 */
    @property([cc.Material])
    changeMatChoose: cc.Material[] = [];
    @property([cc.Material])
    changeMatChoose2: cc.Material[] = [];
    /**向左旋转45 */
    @property(cc.Button)
    leftBtn: cc.Button = null;
    /**向右旋转45 */
    @property(cc.Button)
    rightBtn: cc.Button = null;
    /**分离、合起 */
    @property(cc.Button)
    divideBtn: cc.Button = null;
    /**已经修改颜色uid物体 */
    changeUids: string[] = [];
    /**当前分离状态,是否分离 */
    curDivideState: boolean = false;
    /**当前角度 */
    curAngle: number = 0;
    /**是否动作中 */
    isPlay: boolean = false;
    /**当前角度 */
    choose_type: number = 0;
    // onLoad () {}
    start() {
        this.setAngle(-15)
        cc.director.getPhysics3DManager().enabled = true;
        this.touchNode.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
        let boxArr = ["1,1|1,2|1,3|2,1|2,2|3,1", "1,1|1,2|2,1", "1,1"]
        let minX = 999
        let maxX = -999
        let minZ = 999
        let maxZ = -999
        for (let i = 0; i  maxX) maxX = x
                if (z  maxZ) maxZ = z
            }
        }
        let maxData = { minX, maxX, minZ, maxZ }
        this.creatLayer(boxArr, maxData)
        this.onShowType(null, 0)
    }
    creatLayer(boxArr = [], maxData) {
        this.layerRootNode.children.forEach((value) => { value.active = false })
        for (let i = 0; i  { value.active = false })
        let boxArr = boxString.split("|")
        for (let i = 0; i = 0
            if (isChoose) {
                this.changeUids.splice(index, 1)
                this.setMaterial(box, false)
                return;
            }
            this.setMaterial(box, true)
            this.changeUids.push(uuid)
        }
    }
    /**
     * 
     * @param event 
     * @param index  0.普通 1.虚线 2.半透明
     */
    onShowType(event, index = 0) {
        index = Number(index) || 0
        this.choose_type = index;
        for (let i = 0; i = 0
                this.setMaterial(box, showChoose)
            }
        }
    }
    /**
     * 
     * @param box 需要改变材质的节点 
     * @param index  是否是选择
     */
    setMaterial(box, showChoose = false) {
        let showArr = showChoose ? this.changeMatChoose : this.changeMat
        let showArr2 = showChoose ? this.changeMatChoose2 : this.changeMat2
        const ren = box.getComponent(cc.MeshRenderer);
        ren.setMaterial(0, showArr[this.choose_type]);
        const ren2 = box.getComponentInChildren(cc.MeshRenderer);
        if (ren2 && showArr2[this.choose_type]) {
            ren2.setMaterial(0, showArr2[this.choose_type]);
            ren2.node.active = true
        }
        else if (!showArr2[this.choose_type]) {
            ren2.node.active = false
        }
    }
    /**向左旋转 */
    onLeftRotate() {
        this.roatateFun(true);
    }
    /**向右旋转 */
    onRightRotate() {
        this.roatateFun(false);
    }
    /**分离 合并 */
    onDivide(event, t = 0.2) {
        if (this.isPlay) return;
        this.isPlay = true;
        let lb = this.divideBtn.node.getComponentInChildren(cc.Label);
        for (let i = 0; i  {
                this.curDivideState = !this.curDivideState;
                this.isPlay = false;
                if (this.curDivideState) lb.string = "合";
                else lb.string = "分";
            }).start();
        }
    }
    /**旋转 */
    roatateFun(left: boolean, angel = 9) {
        if (this.isPlay) return;
        this.isPlay = true;
        let count = 10;
        let func = () => {
            count--;
            if (left) this.curAngle -= angel;
            else this.curAngle += angel;
            let quat: cc.Quat = new cc.Quat();
            let oldVe: cc.Vec3 = new cc.Vec3();
            let oldQuat: cc.Quat = new cc.Quat();
            this.layerRootNode.getRotation(oldQuat);
            oldQuat.toEuler(oldVe);
            this.layerRootNode.setRotation(cc.Quat.fromEuler(quat, oldVe.x, this.curAngle, oldVe.z));
            if (count 
                this.isPlay = false;
                this.unschedule(func);
            }
        }
        this.schedule(func, 0.01, count);
    }
}
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]