Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)

这篇具有很好参考价值的文章主要介绍了Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 整理逻辑思路:

//【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、   2.发射子弹(空格键)

//【程序逻辑2】

首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数    3.克隆子弹 4.让克隆的子弹往前跑

搭建场景

Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪),Unity零基础课程,unity,游戏,游戏引擎

为子弹模板添加刚体,并且限制旋转

Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪),Unity零基础课程,unity,游戏,游戏引擎

编写脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
public class RoleControl : MonoBehaviour
{
    //【业务逻辑】这个脚本用来控制物体移动旋转(WASD)、发射子弹(空格键)
    //【程序逻辑】1.首先检测用户是否按下空格键 2.如果按下就执行发射子弹的函数 
    // 3.发射子弹的函数:创建一个子弹 (克隆函数)4.然后让子弹往枪口前方Z轴移动 

    public GameObject Zidanmuban;//用来存储子弹模板物体
    public GameObject ZidanBorn;//用来存储子弹的出生地空物体
    public GameObject ZidanParent;//将来用于存储场景中克隆出来的子弹的父物体
    public float Forcedaxiao = 10f;
    //---------------------------------------------
    GameObject tempZidan;//用来存储克隆出来的临时子弹物体

    public float Movespeed = 10f;//主角移动速度控制
    public float Rotatepeed = 10f;//主角旋转速度控制
 float RotationY;//用来累积存储用户每次移动鼠标得出的值
    float RotationX;//用来累积存储用户每次移动鼠标得出的值

    void Start()
    {
        Zidanmuban = GameObject.Find("Zidanmuban"); //从场景中查找到并存储子弹模板物体
        ZidanBorn = GameObject.Find("ZidanBorn");//从场景中查找到并存储子弹出生地物体
        ZidanParent = GameObject.Find("ZidanParent");//从场景中查找到并存储子弹父亲物体
    }
    
    void Update()
    {
        ControlMove();//用来控制主角移动旋转
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("用户按下空格键");
            FPSShot();
        }

        GameObject.Destroy(tempZidan, 2f);//两秒后销毁物体
    }

    void FPSShot()
    {
        Debug.Log("用户开始发射子弹");
        tempZidan = GameObject.Instantiate(Zidanmuban, ZidanBorn.transform.position, Quaternion.Euler(0, 0, 0), ZidanParent.transform);//克隆子弹
        tempZidan.GetComponent<Rigidbody>().AddForce(ZidanBorn.transform.forward*Forcedaxiao, ForceMode.Impulse);
        
        tempZidan.transform.Rotate(ZidanBorn.transform.TransformDirection(new Vector3(90,0,0)));


    }

    void ControlMove()//用来控制主角移动旋转
    {

        //【控制物体旋转】

        // 获取鼠标的旋转输入值  ,Mouse X\ MouseY 是来源鼠标在水平方向的移动数值转换返回为-1 -  1 之间的数值
        float RotaY = Input.GetAxis("Mouse X");//鼠标水平移动返回-1  -  +  1,这个数值将来用来给物体绕Y轴旋转
        float RotaX = Input.GetAxis("Mouse Y");//鼠标水平移动返回-1  -  +  1,这个数值将来用来给物体绕X轴旋转

        //这是使用欧拉角的旋转方式,这种旋转有个缺陷就是,旋转一个轴没有问题!不能同时旋转2个及以上的轴。
        //transform.Rotate(new Vector3(RotaX * Rotatespeed,RotaY * Rotatespeed,0),Space.Self); 
        //旋转2个及以上的轴,需要用四元数赋值给Retation
        RotationY += RotaY * Rotatespeed*Time.deltaTime;
        RotationX+= RotaX * Rotatespeed * Time.deltaTime;
        this.transform.rotation = Quaternion.Euler(RotationX, RotationY, 0);
        LimtRotatX();
    }
 void LimtRotatX()
    {//限制了上下旋转也就是围绕X轴旋转的最小角度和最大角度  !注意 -50 代表后仰旋转!60  度代表了!往前旋转!
        RotationX = Mathf.Clamp(RotationX,-50,60);
  }
    
}





摄像机跟踪和脚本

这个脚本需要挂在到摄像机,里面谈到的目标物体是在场景中,主角身上加了个空物体,并且放在主角后方,这个变量需要外部给文章来源地址https://www.toymoban.com/news/detail-741473.html

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

public class CameraFollow : MonoBehaviour
{
    // 用来控制摄像机平滑跟踪
    [SerializeField]
    public GameObject oneTarget;//摄像机跟踪目标点,外部赋值
    public float Followspeed = 1f;
    
    void Update()
    {
        if (oneTarget != null)
        {
            Vector3 FinllTargetPos = oneTarget.transform.TransformPoint(0, 5, -5);
            this.transform.position = Vector3.Lerp(this.transform.position, FinllTargetPos, Followspeed * Time.deltaTime);
            transform.LookAt(oneTarget.transform);
        }
    }
}

到了这里,关于Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包