unity实现物体移动-敌人跟踪-放置炸弹

531 阅读3分钟

1.新建项目工程

2.导入资源包

在asset文件夹右键-导入包-自定义包 image.png

3.导入地图到3D窗口中

这时候各种不同的物体都是已经提前建好的,我们只需完成一些物体的移动即可 image.png

4.新建脚本文件

在asset文件夹右键新建文件夹script,文件夹里面存放的是c#脚本文件。

image.png

5.将新建好的playe脚本文件挂载到player的物体上

image.png

6.更改player人物的标签名,可以方便在脚本文件里面通过标签名进行获取

image.png

7.编写player脚本文件代码

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

public class player : MonoBehaviour
{
        //让玩家移动
    private float x;
    private float z;
    private Vector3 vector;
    // Start is called before the first frame update
    void Start()
    {

    }
    private float boomTime = 2f;
    public GameObject boomObj;
    private void Update()
    {
        x = Input.GetAxis("Horizontal");
        z = Input.GetAxis("Vertical");
        //按下r键之后,就放炸弹,按下之后必须2秒之后才能继续按下去
        if (Input.GetKey(KeyCode.R))
        {
            //必须boomTime大于等于2秒才会放置炸弹
            if (boomTime >= 2f)
            {
                GameObject clone = Instantiate(boomObj, transform.position, transform.rotation);
                //将时间清除0
                boomTime = 0;
            }
        }
        boomTime += Time.deltaTime;
    }
    // Update is called once per frame
    void FixedUpdate()
    {
        //FixedUpdate--更新帧率稳定的使用
        //Update --根据当前电脑的帧率决定的。
        //获取虚拟轴
        x = Input.GetAxis("Horizontal");
        z = Input.GetAxis("Vertical");
        float d = Mathf.Sqrt(x*x+z*z);
        //判断  拿到一个变化后的向量
        vector = new Vector3(x, 0, z); //zero = (0,0,0)
        if (vector != Vector3.zero) //不等于0说明按下了按键
        {
            //改变位置 --将物体朝向vector的方向就可以了 
            transform.rotation = Quaternion.LookRotation(vector);
            //移动操作 --朝着这个方向并且朝着这个方向同步移动
            transform.Translate(Vector3.forward * 7 * Time.deltaTime);
        }
    }
}

8.将爆炸效果和boom脚本文件挂载到炸弹物体上

image.png

9.编写boom脚本文件

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

public class boom : MonoBehaviour
{
    public GameObject boomobj; //写完之后再给对象保存之后untiy检查器会有对应的变量名,将效果拖入变量名即可
    // 炸弹倒计时2s会爆炸--当这个玩家按下r键会克隆出现在玩家的底下
    // 隔俩秒爆炸 会显示爆炸的特效 爆炸完后爆炸特效消失,删除特效和炸弹
    void Start() //委托使用invoke去调用 invoke(方法名,延迟执行的时间)
    {
        //2s出现炸弹的特效
        Invoke("baozha",2f);
    }
    public void baozha()
    {
        Debug.Log("我要爆炸了");
        //显示特效  特效加载进来 
        GameObject cloneBoom = Instantiate(boomobj,transform.position,transform.rotation); //显示炸弹的位置

        //删除炸弹 gameObject表示当前的游戏对象  
        Destroy(this.gameObject);
        //删除炸弹特效
        Destroy(cloneBoom, 2f); //隔2秒删除克隆体
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

10.伴随物体的移动,摄像机也会跟着移动效果

将相机脚本挂载到相机物体上

image.png

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

public class camera : MonoBehaviour
{
    //保存开始时,玩家和相机的向量 
    private Vector3 vector;
    //保存玩家的transform组件 
    private GameObject player;
    // Start is called before the first frame update
    void Start()
    {
        //通过标签获取玩家的transform组件
        player = GameObject.FindWithTag("Player");
        //获取玩家和相机之间的向量
        vector = player.transform.position - transform.position;
    }
    
    
    // Update is called once per frame
    void Update()
    {
        //每次更新相机的位置--物体在前,摄像头在后面跟踪
        transform.position = player.transform.position - vector;
    }
}

11.编写敌人enemy脚本文件

1.更改enemy物体的标签名

image.png

2.enemy脚本文件

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

public class enemy : MonoBehaviour
{
    public GameObject player;
    public float distance;
    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.FindWithTag("Player");

    }
    // Update is called once per frame
    void Update()
    {
        //持续拿到玩家和敌人的距离
        distance = Vector3.Distance(player.transform.position, transform.position);
        if (distance < 10)
        {
            //敌人要抓玩家操作了
            //1.敌人面向玩家
            transform.LookAt(player.transform.position);
            //2.敌人开始抓捕玩家
            transform.Translate(Vector3.forward * 1 * Time.deltaTime);
        }
        if (distance < 2)
        {
            //Messagebox.MessageBox(IntPtr.Zero, "还没有该场景!", "xxx", 0);
            Debug.Log("游戏结束");
            Time.timeScale = 0; //0表示游戏结束,1表示正常运行
        }
    }
}


12.给player物体添加刚体组件,简单的防止player玩家碰强出去

image.png 完整项目效果演示:

动画.gif

项目遇到的问题: 1.脚本挂载到物体的时候,要确保脚本里面的类和你的脚本名称保持一致,否则会出现挂载不到的问题 2.FixedUpdate和Update的区别

  • 三者执行顺序:FixedUpdate ——>Update ——>LateUpdate
  • 三者作用:FixedUpdate固定帧更新,一般用作物理更新;Update一般用作游戏逻辑更新;LateUpdate一般用作相机更新

其中

FixedUpdate--更新帧率稳定的使用

Update --根据当前电脑的帧率决定的。 主要区别可以访问:blog.csdn.net/enternalsta…