CocosCreator-3D 3D物体触摸移动(跟随移动)

 版本: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);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值