UnityScript基础

摘要:
例如:scoreDisplay:{default:null,type:cc.Label},2。属性中的音效声明不需要指定类型,只需指定URL URL:cc.AudioClip。初始化处于中间状态的一些数据。这些数据在更新期间可能会更改,并且经常启用和禁用updateUpdateonDestroyonEnableonDisable11。加载场景:cc.director.loadScene;12预加载场景:在后台默默加载新场景,加载后手动切换。1cc.director.loadScene;13.驻留节点:场景切换时不会自动销毁,驻留在内存中。

基本格式

 1 cc.Class({
 2     extends: cc.Component,
 3 
 4     properties: {
 5     },
 6 
 7     // use this for initialization
 8     onLoad: function () {
 9     },
10 
11     // called every frame, uncomment this function to activate update callback
12     update: function (dt) {
13     },
14 });

1.属性中声明某个Label是,类型指定为cc.Label,而不是cc.Node。

例如:

scoreDisplay: {
            default: null,
            type: cc.Label
},

2.属性中音效声明,不需要指定类型,只需要指出URL,url:cc.AudioClip。

例如:

scoreAudio: {
            default: null,
            url: cc.AudioClip
        },

3.播放音效:

cc.audioEngine.playEffect(this.jumpAudio, false);

4.暂存对对象的引用

 // 暂存对脚本 GameManager 对象的引用
properties: {
        gameManager: {
            default: null,
            serializable: false
        }
}

可以通过this.gameManager.player.getPosition();获取GameManager中player属性的位置。

总结:属性中的常用参数

    default: 设置属性的默认值,这个默认值仅在组件第一次添加到节点上时才会用到
    type: 限定属性的数据类型,详见 CCClass 进阶参考:type 参数
    visible: 设为 false 则不在 属性检查器 面板中显示该属性
    serializable: 设为 false 则不序列化(保存)该属性
    displayName: 在 属性检查器 面板中显示成指定名字
    tooltip: 在 属性检查器 面板中添加属性的 Tooltip

注意:数组的 default 必须设置为 [],如果要在 属性检查器 中编辑,还需要设置 type 为构造函数,枚举,或者 cc.Integercc.Floatcc.Booleancc.String

例如:

 1 properties: {
 2     names: {
 3         default: [],
 4         type: [cc.String]   // 用 type 指定数组的每个元素都是字符串类型
 5     },
 6 
 7     enemies: {
 8         default: [],
 9         type: [cc.Node]     // type 同样写成数组,提高代码可读性
10     },
11 }

5.计算两点的距离:cc.pDistance()

6.销毁某个节点:this.node.destory() ;

7.场景资源的延迟加载:如果选项开启,则这个场景直接或间接依赖的所有贴图、粒子和声音都将被延迟到场景切换后才加载,使场景切换速度极大提升。玩家进入场景后可能会看到一些资源陆续显示出来,并且激活新界面时也可能会看到界面中的元素陆续显示出来,因此这种加载方式更适合网页游戏。

8.Cocos Creator 可以使用的图片格式,目前包括 JPGPNG 两种。

9.节点的激活与关闭

this.node.active = true;
this.node.active = false;

10.Cocos Creator目前提供给用户的生命周期回调函数主要有:

  • onLoad:在组件首次激活时触发,会在任何 start 方法调用前执行,做一些初始化相关的操作。
  • start:组件第一次激活前,也就是第一次执行 update 之前触发。初始化一些中间状态的数据,这些数据可能在 update 时会发生改变,并且被频繁的 enable 和 disable
  • update
  • lateUpdate
  • onDestroy
  • onEnable
  • onDisable

11.加载场景:cc.director.loadScene("MyScene");

12预加载场景:后台静默加载新场景,并在加载完成后手动进行切换。那就可以预先使用 preloadScene 接口对场景进行预加载:

1 cc.director.preloadScene("table", function () {
2     cc.log("Next scene preloaded");
3 });

合适的时间调用 loadScene, 就可以真正切换场景。

1 cc.director.loadScene("table");

13.常驻节点:在场景切换时不被自动销毁,常驻内存。

1 cc.game.addPersistRootNode(myNode);

这样挂在上面的组件都可以在场景之间持续作用,我们可以用这样的方法来储存玩家信息,或下一个场景初始化时需要的各种数据。

取消一个节点的常驻属性:

cc.game.removePersistRootNode(myNode);

14.两种资源:Asset和Raw Asset

Asset:cc.SpriteFrame, cc.AnimationClip, cc.Prefab 等资源都属于 Asset

定义一个 Asset 属性:

 1 cc.Class({
 2     extends: cc.Component,
 3     properties: {
 4 
 5         spriteFrame: {
 6             default: null,
 7             type: cc.SpriteFrame
 8         },
 9 
10     }
11 });

Raw  Asset:图片(cc.Texture2D),声音(cc.AudioClip),粒子(cc.ParticleAsset)等资源都是 Raw Asset

定义一个Raw  Asset 属性:

 1 cc.Class({
 2     extends: cc.Component,
 3     properties: {
 4 
 5         textureURL: {
 6             default: "",
 7             url: cc.Texture2D
 8         }
 9 
10     }
11 });

15.加载释放Asset资源

动态加载资源:必须放置在 resources 文件夹或它的子文件夹下

 加载那些位于 resources 目录下的 Asset:cc.loader.loadRes

1 // 加载 Prefab
2 cc.loader.loadRes("test assets/prefab", function (err, prefab) {
3     var newNode = cc.instantiate(prefab);
4     cc.director.getScene().addChild(newNode);
5 });
// 加载 SpriteAtlas(图集),并且获取其中的一个 SpriteFrame
// 注意 atlas 资源文件(plist)通常会和一个同名的图片文件(png)放在一个目录下, 所以需要在第二个参数指定资源类型
cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {
    var frame = atlas.getSpriteFrame('sheep_down_0');
    sprite.spriteFrame = frame;
});
1 图片设置为 Sprite 后,将会在 资源管理器 中生成一个对应的 SpriteFrame。但如果直接加载 test assets/image,
得到的类型将会是 cc.Texture2D。必须指定第二个参数为资源的类型,才能加载到图片生成的 cc.SpriteFrame: 2 // 加载 SpriteFrame 3 var self = this; 4 cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame) { 5 self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame; 6 });

释放资源:cc.loader.releaseRes

1 cc.loader.releaseRes("test assets/image", cc.SpriteFrame);
2 cc.loader.releaseRes("test assets/anim");

16.加载Raw  Asset资源

动态加载资源:可以直接使用 url 从远程服务器上加载,也可以从项目中动态加载。对远程加载而言,使用 cc.loader.load 即可。对项目里的 Raw Asset,加载方式和 Asset 一样:

// 加载 Texture,不需要后缀名
cc.loader.loadRes("test assets/image", function (err, texture) {
    ...
});

17.上面介绍的加载方式都是对于单个资源,如果是需要加载相同路径下的多个资源,需要使用:cc.loader.loadResDir

 1 // 加载 test assets 目录下所有资源
 2 cc.loader.loadResDir("test assets", function (err, assets) {
 3     // ...
 4 });
 5 
 6 // 加载 sheep.plist 图集中的所有 SpriteFrame
 7 cc.loader.loadResDir("test assets/sheep", cc.SpriteFrame, function (err, assets) {
 8     // assets 是一个 SpriteFrame 数组,已经包含了图集中的所有 SpriteFrame。
 9     // 而 loadRes('test assets/sheep', cc.SpriteAtlas, function (err, atlas) {...}) 获得的则是整个 SpriteAtlas 对象。
10 });

18.加载远程贴图资源:加载用户头像等或如果用户用其他方式下载了资源到本地设备存储中。 cc.loader.load

 1 // 远程 url 带图片后缀名
 2 var remoteUrl = "http://unknown.org/someres.png";
 3 cc.loader.load(remoteUrl, function (err, texture) {
 4     // Use texture to create sprite frame
 5 });
 6 
 7 // 远程 url 不带图片后缀名,此时必须指定远程图片文件的类型
 8 remoteUrl = "http://unknown.org/emoji?id=124982374";
 9 cc.loader.load({url: remoteUrl, type: 'png'}, function () {
10     // Use texture to create sprite frame
11 });
12 
13 // 用绝对路径加载设备存储内的资源,比如相册
14 var absolutePath = "/dara/data/some/path/to/image.png"
15 cc.loader.load(absolutePath, function () {
16     // Use texture to create sprite frame
17 });

 19.输入事件:键盘、设备重力传感器此类全局事件是通过函数 cc.systemEvent.on(type, callback, target) 注册的。

type 类型有:

  1. cc.SystemEvent.EventType.KEY_DOWN (键盘按下)
  2. cc.SystemEvent.EventType.KEY_UP (键盘释放)
  3. cc.SystemEvent.EventType.DEVICEMOTION (设备重力传感)

键盘事件:

  • 事件监听器类型:cc.SystemEvent.EventType.KEY_DOWNcc.SystemEvent.EventType.KEY_UP
  • 事件触发后的回调函数:callback(event);
 1 cc.Class({
 2     extends: cc.Component,
 3     onLoad: function () {
 4         // add key down and key up event
 5         cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
 6         cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
 7     },
 8 
 9     onDestroy () {
10         cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
11         cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
12     },
13 
14     onKeyDown: function (event) {
15         switch(event.keyCode) {
16             case cc.KEY.a:
17                 console.log('Press a key');
18                 break;
19         }
20     },
21 
22     onKeyUp: function (event) {
23         switch(event.keyCode) {
24             case cc.KEY.a:
25                 console.log('release a key');
26                 break;
27         }
28     }
29 });

重力传感事件

  • 事件监听器类型:cc.SystemEvent.EventType.DEVICEMOTION
  • 事件触发后的回调函数:callback(event);
 1 cc.Class({
 2     extends: cc.Component,
 3     onLoad () {
 4         // open Accelerometer
 5         cc.systemEvent.setAccelerometerEnabled(true);
 6         cc.systemEvent.on(cc.SystemEvent.EventType.DEVICEMOTION, this.onDeviceMotionEvent, this);
 7     },
 8 
 9     onDestroy () {
10         cc.systemEvent.off(cc.SystemEvent.EventType.DEVICEMOTION, this.onDeviceMotionEvent, this);
11     },
12 
13     onDeviceMotionEvent (event) {
14         cc.log(event.acc.x + "   " + event.acc.y);
15     },
16 });

20.动作系统

// 创建一个移动动作
var action = cc.moveTo(2, 100, 100);
// 执行动作
node.runAction(action);
// 停止一个动作
node.stopAction(action);
// 停止所有动作
node.stopAllActions();

cc.moveTo 用来移动节点到某个位置;cc.rotateBy 用来旋转节点一定的角度;cc.scaleTo 用来缩放节点。

顺序动作 cc.sequence 顺序动作可以让一系列子动作按顺序一个个执行。

// 让节点左右来回移动
 var seq = cc.sequence(cc.moveBy(0.5, 200, 0), cc.moveBy(0.5, -200, 0));
 node.runAction(seq);

同步动作 cc.spawn 同步动作可以同步执行对一系列子动作

// 让节点在向上移动的同时缩放
 var spawn = cc.spawn(cc.moveBy(0.5, 0, 50), cc.scaleTo(0.5, 0.8, 1.4));
 node.runAction(spawn);

重复动作 cc.repeat 重复动作用来多次重复一个动作

// 让节点左右来回移动,并重复5次
 var seq = cc.repeat(cc.sequence(cc.moveBy(2, 200, 0),cc.moveBy(2, -200, 0)), 5);
 node.runAction(seq);

永远重复动作 cc.repeatForever 让目标动作一直重复,直到手动停止

// 让节点左右来回移动并一直重复
 var seq = cc.repeatForever(cc.sequence(cc.moveBy(2, 200, 0),cc.moveBy(2, -200, 0)));

速度动作 cc.speed 速度动作可以改变目标动作的执行速率,让动作更快或者更慢完成

// 让目标动作速度加快一倍,相当于原本2秒的动作在1秒内完成
 var action = cc.speed( cc.spawn( cc.moveBy(2, 0, 50),cc.scaleTo(2, 0.8, 1.4)), 0.5);
 node.runAction(action);

21.计时器

//开始一个计时器
 component.schedule(function() {
     // 这里的 this 指向 component
     this.doSomething();
 }, 5);

Component 中所有关于计时器的函数:

  • schedule:开始一个计时器
  • scheduleOnce:开始一个只执行一次的计时器
  • unschedule:取消一个计时器
  • unscheduleAllCallbacks:取消这个组件的所有计时器

22.使用统一的控制脚本来初始化其他脚本

 1 // Game.js
 2 
 3 const Player = require('Player');
 4 const Enemy = require('Enemy');
 5 const Menu = require('Menu');
 6 
 7 cc.Class({
 8     extends: cc.Component,
 9     properties: {
10         player: Player,
11         enemy: Enemy,
12         menu: Menu
13     },
14 
15     onLoad: function () {
16         this.player.init();
17         this.enemy.init();
18         this.menu.init();
19     }
20 });

其中在 Player.js, Enemy.jsMenu.js 中需要实现 init 方法,并将初始化逻辑放进去。这样我们就可以保证 Player, Enemy 和 Menu 的初始化顺序。

23.对象池

假如玩家在一关中要杀死 100 个敌人,但同时出现的敌人不超过 5 个,那我们就只需要生成 5 个节点大小的对象池,然后循环使用就可以了。

//初始化对象池
properties: {
    enemyPrefab: cc.Prefab
},
onLoad: function () {
    this.enemyPool = new cc.NodePool();
    let initCount = 5;
    for (let i = 0; i < initCount; ++i) {
        let enemy = cc.instantiate(this.enemyPrefab); // 创建节点
        this.enemyPool.put(enemy); // 通过 putInPool 接口放入对象池
    }
}

//...

//从对象池请求对象
// ...

createEnemy: function (parentNode) {
    let enemy = null;
    if (this.enemyPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
        enemy = this.enemyPool.get();
    } else { // 如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建
        enemy = cc.instantiate(this.enemyPrefab);
    }
    enemy.parent = parentNode; // 将生成的敌人加入节点树
    enemy.getComponent('Enemy').init(); //接下来就可以调用 enemy 身上的脚本进行初始化
}

//...

//将对象返回对象池
// ...

onEnemyKilled: function (enemy) {
    // enemy 应该是一个 cc.Node
    this.enemyPool.put(enemy); // 和初始化时的方法一样,将节点放进对象池,这个方法会同时调用节点的 removeFromParent
}

23.

免责声明:文章转载自《UnityScript基础》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python软件开发目录规范R数据挖掘 第二篇:基于距离评估数据的相似性和相异性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UBoot代码分析与移植

一.摘要 这篇文章主要对BootLoader(UBoot)的源码进行了分析,并对UBoot的移植略作提及。 BootLoader的总目标是正确调用内核的执行,由于大部分的BoorLoader都依赖于CPU的体系结构。因此大部分的BootLoader都分为两个步骤启动。依赖于CPU体系结构(如设备初始化等)的代码都放在stage1。而stage2一般使用C语...

binary hacks读数笔记(readelf基本命令)

一、首先对readelf常用的参数进行简单说明: readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍: 1、readelf -v 显示版本 2、readelf -h 显示帮助 3、readelf -a test 显示test的全部信息 4、readelf -h te...

iOS内存区域分布

概览 1,RAM ROM 2,内存的几大区域 3,案例解释 RAM ROM RAM:运行内存,不能掉电存储。 ROM:存储性内存,可以掉电存储,例如内存卡、Flash。 内存的几大区域 为了合理的分配有限的内存空间,将内存区域分为五个区,由低地址向高地址分类分别是:代码区、常量区、全局静态区、堆、栈 代码区 用来存放函数的二进制代码,在运行时要防止被非法修...

[php]laravel框架容器管理的一些要点

本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点。文章很长,但是内容应该很有用,希望有需要的朋友能看到。php经验有限,不到位的地方,欢迎帮忙指正。 1. laravel容器基本认识 laravel框架是有一个容器框架,框架应用程序的实例就是一个超大的容器,这个实例在bootstrap/app.php内进行...

Java基础-对象的内存分配与初始化(一定要明白的干货)

首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象。Java虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。一旦某个类的Class对象被载入到内存,他就被用来创建这个类的所有对象。 类的加载会发生在什么时候呢?所有的类都是在其...

mysql8下载安装及配置

mysql8下载和安装 一、下载 官网地址:https://dev.mysql.com/downloads/mysql/8.0.html 选择“downloads”-->"mysql community server",如下图所示: 向下滑动页面,找到你电脑适配的版本,点击“download”,如下图: 页面跳转,不需要注册和登陆,点击“No t...