19.玩家-基础移动旋转摄像机跟随等
19.1 知识点
拖一个玩家坦克预制体进游戏场景,查看玩家坦克预制体构成
- 玩家坦克预制体构成如下:
- 主体模型:包含坦克的外观和碰撞体
- 炮塔:可以旋转的部分,用于控制炮管方向
- 炮管:用于发射子弹的部分
明确玩家坦克要做的事
- 控制前进后退、旋转
- 控制炮台旋转
- 开火
- 受伤时更新血条
创建玩家坦克脚本,继承坦克基类,在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