Unity3D 学习笔记(八) 锁定目标与 Physics.OverlapBox

添加所需变量

添加变量

    public bool lockon;

新button

    public Button lockButton = new Button();

以及

    lockButton.Tick(Input.GetKey(keyLock));
        lockon =  lockButton.OnPressed;

调取这个信号

    if(pi.lockon){

        camcon.LockSwitch();

    }

在CameraController中

public void LockSwitch()

{

    print("lock");

}

尝试lock可以正常调用

利用OverlapBox检测碰撞

检测target使用API Physics.OverlapBox


public static Collider[] **OverlapBox**([Vector3](https://docs.unity3d.com/ScriptReference/Vector3.html) **center**, [Vector3](https://docs.unity3d.com/ScriptReference/Vector3.html) **halfExtents**, [Quaternion](https://docs.unity3d.com/ScriptReference/Quaternion.html) **orientation** = Quaternion.identity, int **layerMask** = AllLayers, [QueryTriggerInteraction](https://docs.unity3d.com/ScriptReference/QueryTriggerInteraction.html) **queryTriggerInteraction** = QueryTriggerInteraction.UseGlobal);

参数 Vector3类型的BOX中心,三个维度下BOX的半长组成的Vector3,Quaternion类型的BOX的方向,碰撞的Layer,默认为所以的Layer,最后的queryTrigger暂时不需要。

返回值为与BOX碰撞的Collider

在CameraController中声明新变量

private GameObject lockTarget;

完善LockSwitch函数,使其能计算出锁定目标,将其赋值给lockTarget


  public void LockSwitch()

    {

        print("lock");

        //if(lockTarget == null){

            //try to lock others

        Vector3 modelOrigin1 = model.transform.position;

        Vector3 modelOrigin2 = modelOrigin1 + new Vector3(0,1,0);//计算出人脑袋的位置 

        Vector3 boxCenter = modelOrigin2 + model.transform.forward *5.0f;//???

        Collider[] cols = Physics.OverlapBox(boxCenter,new Vector3(0.5f,0.5f,5f),model.transform.rotation,LayerMask.GetMask("Enemy"));

        if(cols.Length == 0){

            lockTarget = null;

        }

        else {

            foreach(var col in cols){

            //print(col.name);

            if(lockTarget == col.gameObject)

            {

                lockTarget = null;

                print("lock cancel");

                break;

            }

            else{

            lockTarget = col.gameObject;

            print(lockTarget);

            break;

            }

        }

        }

    }

修改相机控制中的追踪部分,当无目标时与原来相同,有锁定目标时视线始终看向目标并调整角色朝向


   void FixedUpdate()

    {

        if(lockTarget == null){

        Vector3 tempModeEuler = model.transform.eulerAngles;

        playerHandle.transform.Rotate(Vector3.up,pi.Jright * horizontalSpeed *Time.fixedDeltaTime);

        //cameraHandle.transform.Rotate(Vector3.right,pi.Jup * -verticalSpeed *Time.deltaTime);

        //tempEulerX = cameraHandle.transform.eulerAngles.x;

        tempEulerX -= pi.Jup * verticalSpeed *Time.deltaTime;

        tempEulerX = Mathf.Clamp(tempEulerX,-40,30);

        cameraHandle.transform.localEulerAngles = new Vector3(

           tempEulerX,0,0);

        model.transform.eulerAngles = tempModeEuler;

        }

        else {

            Vector3 tempForward = lockTarget.transform.position - model.transform.position;

            tempForward.y = 0;

            playerHandle.transform.forward = tempForward;

        }

        cam.transform.position = Vector3.SmoothDamp(cam.transform.position,transform.position,ref cameraDampVelocity,0.5f);

        //cam.transform.eulerAngles = transform.eulerAngles;

        cam.transform.LookAt(cameraHandle.transform);//一直看着camerahandle

    }

可以实现视角的锁定

image.png

显示锁定目标的圆圈

image.png

创建一个UI里面的Image

image.png

选择合适的图形、大小、颜色(在game窗口看到这个image)

在cameraController中添加

using UnityEngine.UI;

public Image lockDot;

在start中使其初始不可用

lockDot.enabled = false;

在分支中添加对应的启用和禁用

image.png

此时进游戏发现点在视野中央,但是由于摄像机的跟随效果所以其与锁定目标有所便宜,因此在FixedUpdate中的有锁定目标分支添加


lockDot.transform.position = Camera.main.WorldToScreenPoint (lockTarget.transform.position);

再打开游戏,可以实现效果

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙粽子好吃嘛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值