19.玩家坦克

19.玩家-基础移动旋转摄像机跟随等


19.1 知识点

拖一个玩家坦克预制体进游戏场景,查看玩家坦克预制体构成

  • 玩家坦克预制体构成如下:
    • 主体模型:包含坦克的外观和碰撞体
    • 炮塔:可以旋转的部分,用于控制炮管方向
    • 炮管:用于发射子弹的部分

明确玩家坦克要做的事

  1. 控制前进后退、旋转
  2. 控制炮台旋转
  3. 开火
  4. 受伤时更新血条

创建玩家坦克脚本,继承坦克基类,在Update实现基本的移动旋转开火相关,关联预制体上的物体到变量上

//玩家坦克
public class PlayerObj : TankBaseObj
{    
    void Update()
    {
        //1. ws键 控制 前进后退
        this.transform.Translate(Input.GetAxis("Vertical") * Vector3.forward * moveSpeed * Time.deltaTime);

        //2. ad键 控制 旋转
        this.transform.Rotate(Input.GetAxis("Horizontal") * Vector3.up * roundSpeed * Time.deltaTime);

        //3. 鼠标左右移动 控制 炮台旋转
        tankHead.transform.Rotate(Input.GetAxis("Mouse X") * Vector3.up * headRoundSpeed * Time.deltaTime);

        //4. 开火
        if (Input.GetMouseButtonDown(0))
        {
            Fire();
        }
    }
}

重写坦克基类的受伤函数,受伤时更新血条

public override void Wound(TankBaseObj other)
{
    base.Wound(other);
    //更新主面板血条
    GamePanel.Instance.UpdateHP(this.maxHp, this.hp);
}

把主摄像机拖拽到玩家坦克的炮台上

这样炮台旋转时摄像机也会跟着动,确保玩家在炮塔转动时能够看到准确的目标方向。


19.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//玩家坦克
public class PlayerObj : TankBaseObj
{
    //当前装备的武器
    public WeaponObj nowWeapon;

    //武器父对象位置
    public Transform weaponPos;
    
    void Update()
    {
        //1.ws键 控制 前进后退
        //知识点 
        //1.Transform位移
        //2.Input 轴向输入检测
        this.transform.Translate( Input.GetAxis("Vertical") * Vector3.forward * moveSpeed * Time.deltaTime);

        //2.ad键 控制 旋转
        //知识点
        //1.Transform旋转
        //2.Input 轴向输入检测
        this.transform.Rotate( Input.GetAxis("Horizontal") * Vector3.up * roundSpeed * Time.deltaTime);

        //3.鼠标左右移动 控制 炮台旋转
        //1.Transform旋转
        //2.Input 鼠标轴向输入检测
        tankHead.transform.Rotate( Input.GetAxis("Mouse X") * Vector3.up * headRoundSpeed * Time.deltaTime);

        //4.开火
        //Input
        if( Input.GetMouseButtonDown(0) )
        {
            Fire();
        }
    }

    //重写 父类中的 行为 玩家 可能会存在特殊处理
    public override void Fire()
    {
        if (nowWeapon != null)
            nowWeapon.Fire();
    }

    public override void Dead()
    {
        //这里 不执行 父类的死亡 因为 玩家坦克 摄像机 是它的子对象 如果执行父类死亡
        //会把玩家坦克从场景上移除 那么久间接的移除了摄像机
        //base.Dead();
        //应该处理 失败逻辑 显示失败面板 即可
        Time.timeScale = 0;
        LosePanel.Instance.ShowMe();
    }

    public override void Wound(TankBaseObj other)
    {
        base.Wound(other);
        //更新主面板 血条
        GamePanel.Instance.UpdateHP(this.maxHp, this.hp);
    }

    /// <summary>
    /// 切换武器
    /// </summary>
    /// <param name="obj"></param>
    public void ChangeWeapon(GameObject weapon)
    {
        //删除当前拥有的武器
        if(nowWeapon != null)
        {
            Destroy(nowWeapon.gameObject);
            nowWeapon = null;
        }

        //切换武器
        //创建出武器 设置它的父对象 第三个参数传false保证缩放没什么问题
        GameObject weaponObj = Instantiate(weapon, weaponPos, false);
        //获得武器脚本
        nowWeapon = weaponObj.GetComponent<WeaponObj>();
        //设置武器拥有者
        nowWeapon.SetFather(this);
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏