目录
前言
没想到五一这么快就过去了,闲着没事干整点活吧就。
记得小时候玩罪恶都市最爽的就是召唤出一辆坦克出来开着它在大街上横冲直撞,那时候的我记单词也最认真了。现在我尝试用刚学不久的Unity复刻一下坦克装甲车作弊码的场景。
(这张图片是侠盗猎车手罪恶都市里边的装甲车,官方给我算违规了😠)
我们来回顾一下,当我们输入正确的作弊码之后坦克就会在附近天上掉下来,然后我们靠近按上车键控制的角色就会由汤米变为坦克,我们就按照这个步骤来实现。
一、准备工作
场景我们就拿之前闪电侠的场景来做,然后去找坦克资源模型。
小编觉得这个很不错拿来用,选一个自己喜欢的颜色拖到场景中,乌拉
没想到这么小一个小坦克,高度都没有闪电侠高,一脚就能给你踹飞。
二、坦克角色控制
有了坦克模型后我们要想办法能够控制它。编写控制坦克的脚本TankControl,把主摄像机放到坦克下边。
坦克的上车我通过触发器来实现,在坦克下新建一个空对象并把它作为触发器,当玩家接触到触发器操作玩家取消激活操作角色变为坦克。下车通过按F键来实现。
public class TankControl : MonoBehaviour {
//属性
public float speedMove = 5;
public float speedRotate = 5;
public float speedHeadRotate = 20;
private Vector3 offsetTankAndCamera;
//引用
public GameObject tankHead;
[SerializeField]
public GameObject Player;
[SerializeField]
public GameObject Tank;
[SerializeField]
private GameObject MainCamera;
void Update () {
//坦克移动
TankMove();
//坦克旋转
TankRotate();
//坦克脑袋旋转
TankHeadRotate();
}
//坦克移动
public void TankMove()
{
//水平轴
float horizontal = Input.GetAxis("Horizontal");
//垂直轴
float vertical = Input.GetAxis("Vertical");
//创建成一个方向向量
Vector3 dir = new Vector3(horizontal, 0, vertical);
//朝方向向量移动
transform.Translate(dir * speedMove * Time.deltaTime);
//F键下车
if (Input.GetKeyDown(KeyCode.F))
{
Vector3 Pposition = Tank.transform.position;
Pposition.x -= 10;
Player.transform.position = Pposition;
Player.SetActive(true);
MainCamera.SetActive(false);
Tank.gameObject.GetComponentInParent<TankControl>().enabled = false;
}
}
//坦克旋转
public void TankRotate()
{
float h = Input.GetAxis("Horizontal");
gameObject.transform.Rotate(gameObject.transform.up,speedRotate*h*Time.deltaTime ) ;
}
//炮塔旋转
public void TankHeadRotate()
{
//只负责鼠标的X轴
float x = Input.GetAxis("Mouse X");
tankHead.transform.Rotate(gameObject.transform.up,speedHeadRotate*x*Time.deltaTime);
}
}
坦克的刚体组件和碰撞器组件都要挂载好。
三、输入秘籍
简单制作一个按Tab键弹出的输入秘籍的页面,Image作为面板,外加一个输入框一个按钮。我们会判断输入的作弊码是否正确。
[SerializeField]
private GameObject Cheats;
//按Tab键弹出输入秘籍面板
if (Input.GetKeyDown(KeyCode.Tab))
{
Cheats.SetActive(true);
}
四、生成坦克
这是不小心把生成坦克的代码放到Update函数中造成的,没差点笑死我。
先说一下摄像机切换问题,人物角色和坦克角色都有一个摄像机,我这里是通过控制(角色和摄像机)的激活与否来控制他们直接切换的。
当生成坦克用的是Instantiate()方法上车时会提示 Display 1 No cameras rendering,后边我改为不是生成一个坦克而是激活原本就存在的坦克并在指定的地点生成。编写GetInput脚本来实现
public class GetInput : MonoBehaviour
{
//获取秘籍输入文本框
[SerializeField]
private InputField InputField;
//坦克生成点
[SerializeField]
private GameObject panzerPoint;
//坦克对象
[SerializeField]
private GameObject PanzerPro;
//秘籍输入面板
[SerializeField]
private GameObject Image;
public void GetPanzer()
{
if (InputField.text != null && InputField.text.Equals("panzer"))
{
producePan();
Image.SetActive(false);
}
else
{
Debug.Log("回去背秘籍去!!!");
Image.SetActive(false);
}
}
public void producePan()
{
PanzerPro.transform.position = panzerPoint.transform.position;
PanzerPro.SetActive(true);
}
}
将GetInput脚本挂载到输入秘籍面板上。
按钮绑定生成坦克的方法,点击按钮就会触发。
五、最终效果
看一下最终效果: