查看原文
其他

Creator3D 打砖块子弹发射,以及摄像机平滑移动控制!

张晓衡 Creator星球游戏开发社区 2021-08-09


在线体验链接:http://example.creator-star.cn/block3d/

前面一篇教程《Creator3D图文教程【打砖块】》,我们讲了打砖块游戏中的 3D 物体的场景布局、材质资源、物理刚体与碰撞组件,接下来本篇文章重点介绍“子弹的发射”与“摄像机移动”,有了这两部分我们的游戏就可以初步玩起来了。

1子弹的发射

子弹是由 3D 物体 Sphere 球体创建,并将节点改名为 bullet,看下图:

在层级管理器中将 bullet 节点拖动到资源管理器中,将它创建成一个 Prefab 预制体。同时在 bullet 子弹节点上挂载“球体碰撞组件”和“刚体组件”,如下图所示:

有了 bullet 预制体,我们就可以用代码去实例化它,并将发射出去,创建一个 shoot 的TypeScript 脚本并将它挂载到 Camera 摄像机节点上:

将shoot组件的子弹预制体拖动过去,子弹的移动速度设置为 50,我们通过点击屏幕来进行发射,下面是具体的代码:
import { _decorator, Component, Node, CCObject, Prefab, instantiate, RigidBodyComponent, Vec3 } from "cc";
const { ccclass, property } = _decorator;

@ccclass("shoot")
export class shoot extends Component {

@property(Prefab)
bullet: Prefab;

@property(cc.Float)
speed = 0;

start () {
//注册全局触摸点击事件
cc.systemEvent.on(Node.EventType.TOUCH_END, () => {
this.shoot();
});
}

shoot() {
//实例化 bullet 预制体
let node = instantiate(this.bullet);
node.parent = this.node.parent;
node.position = this.node.position;
//为刚体施加冲量
let bullet:RigidBodyComponent = node.getComponent(RigidBodyComponent);
bullet.applyImpulse(new Vec3(0, 2.29, -1 * this.speed));
}
这里需要注意两点:
  1. 触摸事件是使用cc.systemEvent进行注册的;

  2. 工程中没有代码提示,需要从引擎安装目录中复制cc.d.ts文件到工程中,我是用的Mac系统上,路为:

    /Applications/CocosCreator3D.app/Contents/Resources/resources/3d/engine/bin/.declarations/cc.d.ts

预制体的实例化使用 instantiate 与我们在 Creator 2D 中使用的 API 完全相同,这里就不在赘述。这时我们就可以运行预览,通过点击鼠标或触摸屏幕发射子弹了。
2
摄像机移动

在3D游戏中,通常的做法是使用WSAD四个键进行上下左右的移动,其核心是控制摄像机节点的位置。在我们这个游戏中为了简化游戏操作,我们只控制摄像的 x 和 y 方向的移动:

  • w:y方向增加

  • s:y方向减小

  • a:x方向减小

  • d:x方向增加


创建一个 movement 的脚本用于控制摄像机的移动,下面是组件的设置:

下面重点分析使用键盘控制摄像机移动的相关代码:
//使用 cc.systemEvent.on 注册全局键盘事件
start() {
cc.systemEvent.on(Node.EventType.KEY_DOWN, this.onKeyDown, this);
cc.systemEvent.on(Node.EventType.KEY_UP, this.onKeyUp, this);
...
}
在键盘事件 onKeyDown 中标记移动的方向:
onKeyDown(event) {
cc.log(event);
let rotation = this.node.eulerAngles;
let position = this.node.getPosition();
switch(event.keyCode) {
case cc.macro.KEY.w:
this.offset.y = 1;
break;
case cc.macro.KEY.s:
this.offset.y = -1;
break;
case cc.macro.KEY.a:
this.offset.x = -1;
break;
case cc.macro.KEY.d:
this.offset.x = 1;
break;
}
}
当按键松开时,将 offset 变量归 0:
onKeyUp() {
this.offset.x = 0;
this.offset.y = 0;
this.offset.z = 0;
}
重点是在组件的每帧事件 update 中真正控制摄像机节点的移动:
update (deltaTime: number) {
//计算要移动的目标位置
Vec3.add(this.point, this.node.position, this.offset);
//插值计算
Vec3.lerp(this.point, this.node.position, this.point, deltaTime * this.speed);
//移动节点
this.node.setPosition(this.point);
}
为了平滑移动,Shawn 这里参考了官方 Demo 案例中的做法,使用 Vec3.lerp 对当前坐标到要移动的坐标进行插值计算。详细的完整代码,可参考DEMO源码。
3
小结

Creator3D 打砖块是 Shawn 制作的第一个 3D 游戏,也是公众号上第一次写的 3D 相关的教程,目前他只能算是一个 DEMO,还有很多不足的地方,如有不正之处还请大家多多指正。

在线体验链接:http://example.creator-star.cn/block3d/
源码下载地址:https://pan.baidu.com/s/1KadJBNUngg7pAYEFTwTj9g  密码:zjf4
原创不易,特别是一个新的东西,如果教程对你有用,也感谢你点个或分享给更多的人,你的鼓励是我创作的巨大动力,愿我们在前进的道路上砥砺前行,共同成长!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存