给角色添加碰撞器
在catBase添加aabb shape组件 调节好边界
输出信息到黏贴版本
//center (0.0, 0.6, 0.0) size (0.6, 1.2, 0.3)
在onAwake给角色添加碰撞器
onAwake() {
super.onAwake();
this.animator = this.gameObject.getChildByName('CatBase').getComponent(Laya.Animator);
this.animator.play('Cat_RunLong');
//碰撞器章节讲解内容
let aabbshape: AABBShape = new AABBShape();
aabbshape.mask = CollisionMask.Character;
//位运算,表示碰撞器和 障碍物和鱼产生碰撞
aabbshape.collisionMask = 1 << CollisionMask.Obstacle | 1 << CollisionMask.Fish;
//center (0.0, 0.6, 0.0) size (0.6, 1.2, 0.3)
aabbshape.size = new Laya.Vector3(0.6, 1.2, 0.3)
aabbshape.center = new Laya.Vector3(0.0, 0.6, 0.0);
this.gameObject.addComponentIntance(aabbshape);
//考虑到性能原因,开启主动检测的对象才会进行遍历检测
//{a,b,c,......} a.ActiveDetec()
// detect(a ,b)
// detect(a ,c)
//........
//{a,b,c,......} a.ActiveDetec(); b.ActiveDetec()
// detect(a ,b)
// detect(a ,c)
//detect(b ,a)
//detect(b ,c)
aabbshape.ActiveDetec();
//碰撞进入
aabbshape.RegisetCollsionEnter(this, this.OnCollisionEnter)
//碰撞离开
// aabbshape.RegisetCollsionExit(this, this.OnCollisionExit)
OnCollisionEnter(source: AABBShape, target: AABBShape) {
console.log('OnCollisionEnter', target.mask);
if (target.mask == CollisionMask.Fish) {
target.gameObject.active = false;
GameSample.soundMgr.FishCollection.Play();
else if (target.mask == CollisionMask.Obstacle)//障碍物
this.Fail();
let obstalcle = Game.instance.obstacleSpawn.itemMap.getNumberKey(target.gameObject.id)
obstalcle.ani.play('death');
obstalcle.collider.enabled = false;
Fail() {
Game.instance.speed = 0
this.animator.play('Cat_Death')
Reborn(){}
鱼添加碰撞器和逻辑
FishSpwan.ts
添加
//碰撞器教程讲解
protected CreateSpwanItem(spwanItemData: SpwanItemData): SpawnItem {
let item = super.CreateSpwanItem(spwanItemData);
let newgo = item.gob;
let boxCollider = new AABBShape()
boxCollider.mask = CollisionMask.Fish;
boxCollider.collisionMask = 0;
boxCollider.size = new Laya.Vector3(1, 1, 0.34);
boxCollider.center = new Laya.Vector3(0, 0, 0);
newgo.addComponentIntance(boxCollider);
return item;
障碍物添加碰撞器
ObstacleSpawn.ts
//重载CreateSpwanItem
protected CreateSpwanItem(spwanItemData: SpwanItemData): SpawnItem {
let spwanitem = super.CreateSpwanItem(spwanItemData)
let newgo = spwanitem.gob;
//碰撞器的添加
let boxCollider = new AABBShape()
//center (0.0, 0.7, 0.0) size (1.5, 1.4, 0.6)
boxCollider.mask = CollisionMask.Obstacle;
boxCollider.collisionMask = 0;
boxCollider.center = new Laya.Vector3(0.0, 0.7, 0.0)
boxCollider.size = new Laya.Vector3(1.5, 1.4, 0.6)
let collidergob = newgo as Laya.Sprite3D;
collidergob.addComponentIntance(boxCollider);
let obstacle = new Obstacle();
obstacle.ani = newgo.getChildAt(0).getComponent(Laya.Animator) as Laya.Animator;
obstacle.collider = boxCollider;
this.itemMap.add(newgo.id, obstacle)
return spwanitem;
//障碍物模型
export class Obstacle {
ani: Laya.Animator;
//碰撞系统章节会用到
collider: AABBShape;
}
添加
protected onSpawn(newGo: Laya.Sprite3D, spwanItemData: SpwanItemData, z)
…
//重新激活碰撞器
obstacle.collider.enabled=true;
Game.ts
Onawake
… //碰撞检测模块
this.scene.addComponent(CollsionManagerThreeD);
// this.addfishCollider();
验证碰撞器是否成功添加
打开全局设定,开启显示碰撞器
F8 f5
角色碰撞到障碍物后睡觉
自定义碰撞模块哪些是需要知道的?
因为采用了位运算表示碰撞器之间的碰撞种类检测,
所以有新物体增加时CollisionMask会常常也需要同步增加
//因为考虑到性能原因,只有开启了自动检测的对象才会进行检测
//以下为表里有3个对象,1个对象开启检测,需要进行2此运算
//2个对象开启检测,需要进行4此运算
//{a,b,c,…} a.ActiveDetec()
// detect(a ,b)
// detect(a ,c)
//…
//{a,b,c,…} a.ActiveDetec(); b.ActiveDetec()
// detect(a ,b)
// detect(a ,c)
//detect(b ,a)
//detect(b ,c)
碰撞管理器CollsionManagerThreeD.ts
onLateUpdate() {
if (GameDesgin.enableCollsion) {
if (this.detectObjs.length >= 1) {
for (let i = 0; i < this.detectObjs.length; i++) {
let detectAABB = this.detectObjs[i] as AABBShape;
this.GetFilterZItems(this.detectObjs[i].transform.position.z, detectAABB);
this.Detect(detectAABB, detectAABB.moveSpeed);
//进行粗略检测
//结合案例,主角前面30米之内的对象才进行检测
//大多数物理引擎采用的是二叉树,,四叉树,八叉树,进行粗略检测
this.GetFilterZItems(this.detectObjs[i].transform.position.z, detectAABB);
游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya,游戏开发,unity3d,laya
今天用unity5.6播视频,尝试了3种方式,查了一些资料,分享一下。注:其中有些属于转载。我只是搬运工。。。
前2种方法见宣雨松大神的博客链接:Unity3D研究院之两种方式播放游戏视频(二十五) 。这里还在CSND上找到一个分享视频转换器的博客,其中也有一些播放视频的方法觉得写得也不错,贴出来吧:Unity3D播放视频
下面重点介绍第三种方法:
Unity5.6自带的VidePlay
不过没关系,先看下laya集成的源码laya.physics.js, 通过搜索raycast关键字我们可以就可以发现对应接口,虽然laya的libs声明文件中Laya.physics.I.world为any类型,但通过输出到控制台我们可以发现这个就是laya.physics.js文件中的b2World类型,而且有对应的射线检测方法,如下图。有了源码,我们是不是就可以照着上面使用了呢?前言:在实际开发中,发现laya并没有提供2D射线检测的接口,查看源码发现laya的2D物理采用的是。
自定义TimeLine前言四大天王unity中样子类关系结构天王的关键函数TrackClipAssetMixerClipPlayable运行时Graph图结构ClipCapsPlayableDirector界面介绍常用函数结束语
playableAPI推出后,一直没有起色,记得当初Unity大会上,说是为了解放unity的动画系统,因为其操作之复杂枯燥,本应该美术同学的工作要强加给技术,所以当时果断放弃了。但是TimeLine的崛起,又回到我的面前。
unity中样子
上面我们能看到的只要
这种的 够蛋疼了吧。 本来想通过 点击位置的坐标链接成向量,然后 计算向量的 角度 来判断点击的到底是哪个位置。
后来返现Layaari 对向量的封装 没有像Unity3D那么友好。 角度计算有点费劲
后来看见一片文章:Layaari 不规则热区的实现
发现其实 Layaair 已经为我们提供好了 不规则形状 的点击 ...
onOpened(data) {....
//场景读取需要时间,所以在文件读取中会有空白间隔
SceneManager.LoadSceneByName('Home', this, this.OnSceneLoadOk);
解决该问题
新建loadind.scene
用了LayaBox已经半年多了,给我的感受就是每一个版本都有或多或少的bug,博主是先从事Unity再做Laya的,所以刚开始做 H5的3D 小游戏就遇到了一个难以理解的坑 ----- 3D物体碰撞器偏移,这种问题出现在2.4之前的任何版本 , 2.5版本 修复了此bug , 那么2.4之前的我们如何处理呢 ?详细的效果问题请看我发在 LayaBox社区里边的帖子:https://ask.laya...