unity3D实现发射子弹,自动门,车子前后左右移动

实现效果:

点击 “w” 键,坦克前进,点击 “s” 键,坦克后退,点击 “a” 键,坦克向左转,点击 “d” 键,坦克向右转。

点击 “空格” 键,坦克发射炮弹(这里的炮弹是一棵树),当炮弹碰到物体时,物体和炮弹都消失。

当坦克走近关卡时,关卡自动打开,当坦克远离关卡时,关卡自动闭合。

 

制作过程

 

坦克前后左右移动、发射炮弹:

 

  1. 添加一个坦克
  2. 为坦克添加 BoxCollider,Rigidbody 组件
  3. 新建 C# 脚本,脚本名为 TankController ,并将该脚本赋给坦克,脚本内容如下
  4. 为坦克添加一个 Sphere 圆柱体(坦克为父组件,圆柱体为子组件),为圆柱体添加 BoxCollider 组件。圆柱体的作用是标志炮弹发射的位置,为了视觉效果可以将圆柱体隐藏起来,即在属性中将 Mesh Renderer 前的勾去掉。
  5. 制作一个预制体,作为发射的炮弹,这里命名为 palm_01
  6. 为脚本中的共有变量赋值,speed:坦克前后移动时每秒移动的距离      rotspeed:坦克左右转动时每秒移动的距离   bullet:要发射的炮弹,将预制体palm_01拖动到这里    bulletspeed:炮弹发射速度     firePos:标志炮弹发射位置的物体,将第四步中的Sphere圆柱体拖动到此处。                                            
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);//为生成的炮弹对象添加初始的速度矢量
        }
    }
}

 

自动门开关:

 

  1. 从资源包中找到自动门,添加一个到画面中
  2. 为自动门添加 BoxCollider组件
  3. 在属性中将 Is Trigger 勾选上                                                        
  4. 新建 C# 脚本,脚本名为 Door ,并将该脚本赋给自动门,脚本内容如下
  5. 为脚本中的共有变量赋值:在自动门下找到名为 pole 的子组件(即自动门的那根开关),将它赋给共有变量 D
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()
    {
        
    }
}

 

碰撞后物体消失:

 

  1. 随便添加一个物体到画面中,作为炮弹的打击对象,这里添加的是一辆医用军车
  2. 为该物体添加 BoxCollider组件
  3. 新建 C# 脚本,脚本名为 Bullet,脚本内容如下
  4. 将该脚本赋给炮弹的预制体
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   进行下载(项目中包含所用全部资源包)。

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值