Unity3D 射击游戏练习实例

知识点:

  1. 刚体组件(rigidbody),受力和碰撞的组件
  2. 触发器(Trigger),开启后物体碰撞效果取消,但仍会返回碰撞消息
  3. 复制物体对象:var box = Instantiate(对象);
  4. 设置对象坐标位置:box.transform.position = new Vector3(三维坐标点);
  5. 绘制光标:绘制是从左上角为原点开始绘制,为了在准心射击,坐标点做些偏移。
    Cursor.SetCursor(MyCursor, new Vector2(MyCursor.width / 2, MyCursor.height / 2), CursorMode.Auto);
  6. 判断按键:Input.GetButtonDown(按键);
  7. 获取屏幕射线对象:Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  8. 判断射线的物理碰撞:
    Physics.Raycast(射线对象,out 碰撞物体, 射线最长距离)
    Physics.Raycast(ray,out Hit, 50)
  9. 给物体速度、方向:射线碰撞坐标和子弹当前坐标只差形成一个向量,确定速度方向,然后乘上速度大小
    物体对象.GetComponent<Rigidbody>().velocity = 速度方向 * 速度大小;
    bullet.GetComponent<Rigidbody>().velocity = (Hit.point - bullet.transform.position) * 5;

步骤:

  1. 准备物体和子弹、地板,物体和子弹存储对象后,就可以删掉
    子弹和物体都要添加刚体组件
    在这里插入图片描述

  2. 创建GameObject对象,存储脚本
    在这里插入图片描述
    在这里插入图片描述

  3. 设置对象变量,把物体对象赋值给变量
    在这里插入图片描述
    在这里插入图片描述

  4. 设置Quad墙体,这样鼠标点击任何位置都会触发射线碰撞事件
    在这里插入图片描述
    取消墙体渲染,这样墙体就是透明效果。
    开启触发器,这样子弹就不是撞墙,会穿过墙体。
    在这里插入图片描述

  5. 设置光标,找一张透明底的贴图,设置成光标,再赋值给脚本变量
    在这里插入图片描述

  6. 优化项目:删除摄像机视野外的物体对象,节省资源。删除脚本添加在物体内。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


脚本代码

HitPlayGame.cs

public class HitPlayGame : MonoBehaviour
{
    //箱子
    public GameObject Box;
    //球体(子弹)
    public GameObject Bullet;
    //光标
    public Texture2D MyCursor;

    // Start is called before the first frame update
    void Start()
    {
        for(int i = 0; i < 5; i++)
        {
            for(int j = 0; j < 5; j++)
            {
                //复制物体对象,并返回该物体对象,参数:被复制的对象
                var box = Instantiate(Box);
                
                //设置物体的位置
                box.transform.position = new Vector3(-2f+i, 0.5f+j, 4.5f);
            }
        }

        //绘制光标
        Cursor.SetCursor(MyCursor, new Vector2(MyCursor.width / 2, MyCursor.height / 2), CursorMode.Auto);
    }

    // Update is called once per frame
    void Update()
    {
        //按一下鼠标左键,发射一次子弹
        if (Input.GetButtonDown("Fire1"))
        {
            复制物体对象,并返回该物体对象,参数:被复制的对象
            var bullet = Instantiate(Bullet);
            
            //设置物体的位置
            bullet.transform.position = Camera.main.transform.position;
            
            //获取屏幕射线对象
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            
            //碰撞物体变量
            RaycastHit Hit;
            
            //判断射线是否有碰撞对象
            if(Physics.Raycast(ray,out Hit, 50))
            {
                //给子弹对象一个方向和速度
                bullet.GetComponent<Rigidbody>().velocity = (Hit.point - bullet.transform.position)*5;
            }
        }
    }
}

DestoryObj.cs

public class DestoryObj : MonoBehaviour
{
    /// <summary>
    /// 超出摄像机视野执行
    /// </summary>
    private void OnBecameInvisible()
    {
        //删除对象
        Destroy(gameObject);   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值