版本:cocoscreator3.4.0
基本原理:
通过触摸屏幕上的点生成一个射线,通过物理射线检测,获得是否点击到物体
通过射线的检测结果(raycastResults)获得碰撞点(hitPoint)
设置物体的x,z为碰撞点的x,y即可
import { _decorator, Component, Node, Camera, geometry, input, Input, EventTouch, PhysicsSystem, math, clamp, Vec3 } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('move')
export class move extends Component {
@property(Camera)
readonly cameraCom!: Camera;
@property(Node)
public targetNode!: Node
private _ray: geometry.Ray = new geometry.Ray();
_position = new math.Vec3();
start() {
math.Vec3.copy(this._position, this.targetNode.position);
}
onDestroy() {
this._removeEvents();
}
onEnable() {
this._addEvents();
}
onDisable() {
this._removeEvents();
}
private _addEvents() {
input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
}
private _removeEvents() {
input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
}
onTouchMove(event: EventTouch) {
const touch = event.touch!;
this.cameraCom.screenPointToRay(touch.getLocationX(), touch.getLocationY(), this._ray);
if (PhysicsSystem.instance.raycast(this._ray)) {
const raycastResults = PhysicsSystem.instance.raycastResults;
for (let i = 0; i < raycastResults.length; i++) {
const item = raycastResults[i];
if (item.collider.node == this.targetNode) {
console.log('raycast hit the target node !');
this.updatePlayerPos_1(item.hitPoint)
break;
}
}
} else {
console.log('raycast does not hit the target node !');
}
}
updatePlayerPos_1(hitPoint:Vec3){
this._position.x=hitPoint.x
this._position.z=hitPoint.z
this.targetNode.setPosition(this._position);
}
}