赞
踩
点击 “w” 键,坦克前进,点击 “s” 键,坦克后退,点击 “a” 键,坦克向左转,点击 “d” 键,坦克向右转。
点击 “空格” 键,坦克发射炮弹(这里的炮弹是一棵树),当炮弹碰到物体时,物体和炮弹都消失。
当坦克走近关卡时,关卡自动打开,当坦克远离关卡时,关卡自动闭合。
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class TankController : MonoBehaviour
- {
- public int speed;//坦克前后移动时每秒移动的距离
- public float rotspeed;//坦克左右转动时每秒移动的距离
-
- public GameObject bullet;//声明游戏对象:要发射的炮弹
- public int bulletspeed; //炮弹发射速度
-
- public Transform firePos; //标志炮弹发射位置的物体
-
-
- private Transform t;
- // Start is called before the first frame update
- void Start()
- {
- t = this.GetComponent<Transform>(); //获取本身和所有子子物体
- }
-
- void move1()
- { //实现前后左右移动的第一种方法,这里将他们封装在这个move1()函数里,并没有起到实际用。
-
- if (Input.GetKey(KeyCode.W)) //当按下W键时,坦克向前移动
- {
- //通过Translate()这个方法可以使得物体移动,里面有Vector3,(Vector3是一个三维向量,在unity中用于传递3D位置和方向),
- //通过在后面加入Time.deltaTime来使得物体移动更加的平滑。
- //里面还有一个Space.Self,它代表着以自身坐标系来移动,与之相对的还有Space.World,代表着是以世界坐标系来移动的。
- t.Translate(t.forward * Time.deltaTime * -speed, Space.World);
- }
- if (Input.GetKey(KeyCode.S))//当按下S键时,坦克向后移动
- {
- t.Translate(t.forward * Time.deltaTime * speed, Space.World);
- }
- if (Input.GetKey(KeyCode.A))//当按下A键时,坦克向右旋转
- {
- //使用localEulerAngles进行旋转的时候,我们要使用transform.localEulerAngles = new Vector3(x, y,z);
- //其中,new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),
- //则游戏物体从(x1,y1,z1)旋转到(x,y,z),同时也以自身坐标系为参考,而不是世界坐标系。
- t.localEulerAngles += new Vector3(0, 1 * rotspeed, 0);
- }
- if (Input.GetKey(KeyCode.D))//当按下D键时,坦克向左旋转
- {
- t.localEulerAngles -= new Vector3(0, 1 * rotspeed, 0);
- }
- }
-
-
- // Update is called once per frame
- void Update()
- {
- //实现前后左右移动的第二种方法
- float v = Input.GetAxis("Vertical"); //获取输入设备中所有垂直方向的偏移。范围(-1,1)
- float h = Input.GetAxis("Horizontal"); //获取输入设备中所有水平方向的偏移。范围(-1,1)
-
- Vector3 moveDir = new Vector3(h, 0, v);
-
- if (h!=0) //当水平方向的偏移不为0时发生旋转,排除垂直方向(即前后移动)的影响
- {
- Quaternion qua = Quaternion.LookRotation(moveDir); //求出当前物体的方向与即将移动到的方向moveDir的夹角
- transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * rotspeed);
- //缓慢旋转,第一个参数,从哪个角度开始转;第二个参数,要旋转的角度,第三个参数,旋转速度
- }
- transform.Translate(transform.forward * v * Time.deltaTime * -speed, Space.World); //前后移动
-
- if (Input.GetKeyDown(KeyCode.Space))//当按下空格键时,坦克发射炮弹
- {
- GameObject obj = Instantiate(bullet, firePos.position , bullet.transform.rotation);
- //bullet:生成对象 firePos.position :生成位置 bullet.transform.rotation:以什么角度生成。
- Rigidbody rig = obj.AddComponent<Rigidbody>(); //为生成的炮弹对象添加刚体组件:Rigidbody,便于检测它和物体发生碰撞
- rig.AddForce(transform.forward * -1 * bulletspeed);//为生成的炮弹对象添加初始的速度矢量
- }
- }
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class Door : MonoBehaviour
- {
- public Transform d;//这里将自动门的开关赋给d,以实现开关的旋转
-
- // Start is called before the first frame update
- void Start()
- {
-
- }
- void OnTriggerEnter(Collider c)//在脚本中添加这个函数,如果发生碰撞则执行此函数。(相撞的物体至少有一个勾选了isTrigger)
- {
- //当小车与自动门发生碰撞时,开关打开。
- d.localEulerAngles = new Vector3(0, 90, 0);
- }
- void OnTriggerExit(Collider c)//在脚本中添加这个函数,如果碰撞结束则执行此函数。(相撞的物体至少有一个勾选了isTrigger)
- {
- //当小车与自动门发生碰撞时,开关合上。
- d.localEulerAngles = new Vector3(0, 0, 0);
- }
- // Update is called once per frame
- void Update()
- {
-
- }
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class Bullet : MonoBehaviour
- {
- // Start is called before the first frame update
- void Start()
- {
-
- }
-
- void OnCollisionEnter(Collision other)
- //在脚本中添加这个函数,如果发生碰撞则执行此函数。other为与添加了此代码的物体相撞的另一个物体
- {
- Destroy(other.gameObject);//消灭另一个物体
- Destroy(this.gameObject);//消灭这个物体
- }
-
- // Update is called once per frame
- void Update()
- {
-
- }
- }
PS:如需完整项目,请移步 https://download.csdn.net/download/qq_42185999/11884672 进行下载(项目中包含所用全部资源包)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。