今天实现的内容:
新增锁定输入
为输入模块添加锁定键和锁定信号,更新信号。
--- IPlayerInput
public bool lockOn; //锁定信号
--- JoystickInput
public MyButton buttonLockOn = new MyButton(); //锁定键
// Update is called once per frame
void Update()
{
// 更新按键
buttonLockOn.Tick(Input.GetButton(btnRS));
// 锁定信号
lockOn = buttonLockOn.onPressed;
锁定和解锁的代码逻辑和摄像机代码逻辑
首先,要锁定目标,先要确定要锁定的目标是什么。我们使用Physics.OverlapBox来得到指定盒子区域内的碰撞体。
锁定需要始终将摄像机对准目标。所以我们在CameraController中添加新方法LockOn_or_Unlock
用来处理锁定解锁逻辑,然后在PlayerController中调用该方法。
// 摄像机锁定/解除锁定
public void LockOn_or_Unlock()
{
// 尝试去锁定一个
Vector3 tmp_modelCenter = modelGO.transform.position + Vector3.up; //获得模型的中心
Vector3 tmp_boxCenter = tmp_modelCenter + modelGO.transform.forward * 5.0f; //得到OverlapBox的中心
Collider[] cols = Physics.OverlapBox(tmp_boxCenter, //通过OverlapBox尝试获取范围内Enemy标签的碰撞体
new Vector3(1.0f, 1.0f, 5.0f),
modelGO.transform.rotation,
LayerMask.GetMask("Enemy"));
if (cols.Length != 0 && lockTarget == null)
{
//如果得到碰撞体并且没有锁定目标 将第一个赋值给lockTarget
lockTarget = cols[0].gameObject;
lockonIcon.enabled = true;
// 设置LockonIcon的图片位置
lockonIcon.rectTransform.position = Camera.main.WorldToScreenPoint(lockTarget.transform.position);
isLockon = true;
}
else
{
// 如果没有检