unity3d 射击准心_unity3d向前方射击nity3d射击游戏教程 - CSDN
  • Unity游戏开发之绘制准心

    千次阅读 2017-04-26 12:12:08
    public Texture texture;... /// 绘制准心 /// void OnGUI() { //texture.width >> 1和(texture.height >>是右移一位, //相当于除以2。(x >> 1) 和 (x / 2) 的结果是一样的。 //创建一个新的矩形
     public Texture texture;
        /// <summary>
        /// 绘制准心
        /// </summary>
        void OnGUI()
        {
            //texture.width >> 1和(texture.height >>是右移一位,
            //相当于除以2。(x >> 1) 和 (x / 2) 的结果是一样的。
            //创建一个新的矩形
            Rect rect =new Rect(Input.mousePosition.x-(texture.width >>1),//矩形的X轴坐标
                Screen.height-Input.mousePosition.y-(texture.height>>1),//矩形的y轴的坐标
                texture.width ,//矩形的宽
                texture.height);//矩形的高
            GUI.DrawTexture(rect,texture);//开始绘制
        }

    展开全文
  • Unity3D 射击游戏练习实例

    千次阅读 2019-08-28 16:32:00
    知识点: 刚体组件(rigidbody),受力和碰撞的组件 触发器(Trigger),开启后物体碰撞效果取消,但仍会返回碰撞消息 ...绘制光标:绘制是从左上角为原点开始绘制,为了在准心射击,坐标点做些偏移。 Cursor.Se...

    知识点:

    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);   
        }
    }
    
    展开全文
  • Unity3D射击游戏的准心

    千次阅读 2019-09-04 16:27:17
    Unity3D射击游戏的准心中心准心实际射击位置目标射击位置坦克准心       射击游戏中,很难预计子弹打到哪里,毕竟肉眼估算枪管的角度不容易,所以很难打着。因此需要制作一套准心,让它来捕捉...



          射击游戏中,很难预计子弹打到哪里,毕竟肉眼估算枪管的角度不容易,所以很难打着。因此需要制作一套准心,让它来捕捉敌方的位置。此处射击游戏以坦克开炮为例,那么射击所用的便不是枪管,而是炮管了,射出来的不是子弹,而是炮弹了。坦克开炮所制作的准心中心准心坦克准心两部分组成。

    中心准心

           中心准心指向屏幕中央。中心准心的坐标是固定的,假设屏幕宽度为Screen.width、屏幕高度为Screen.Height、准心宽度为centerSight.width,准心高度为centerSight.height,那么中心的坐标为(Screen.width/2 - centerSight.width/2,Screen.height/2 - centerSight.height/2)。如下图:
    在这里插入图片描述

    实际射击位置

           实际射击位置指炮弹爆炸的位置。获取实际射击位置的方法如下:过炮管中心点,,以炮管方向作一条足够长的射线来模拟炮弹的飞行路线,检测射线与场景中游戏物体的碰撞点,该碰撞点为实际爆炸的位置,如下图所示:
    在这里插入图片描述

    目标射击位置

           目标射击位置指中心准心所对应的三维坐标,如下图。获取该值的方法如下:过屏幕中心做一条沿着相机方向的射线,检测射线与场景中游戏物体的碰撞点。该碰撞点即为目标射击位置。随着炮塔和炮管的旋转,实际射击位置会慢慢向目标射击位置靠近,直到两者重合。Unity3D中Camera.ScreenPointToRay方法能够将屏幕位置转成一条射线,后续将用该方法生成射线并检测碰撞点。
    在这里插入图片描述

    坦克准心

           坦克准心指向“实际射击位置”转换成的屏幕坐标,如下图。Unity3D的Camera.main.WorldToScreenPoint方法提供了三维坐标到屏幕坐标的转换,后续将使用该方法计算坦克准心的坐标。
    在这里插入图片描述

           了解上述概念后,可以从3方面逐步完成准心功能:

    1. 计算“目标射击位置”。然后根据“目标射击位置”,计算炮管和炮塔的目标角度,旋转炮管和炮塔。
    2. 计算“实际射击位置”,然后根据“实际射击位置”计算“坦克准心”的坐标。
    3. 在OnGUI方法中绘制准心。
    展开全文
  • 从本篇起,我们将进入实战环节,编写一个简单的第一人称射击游戏。

    一、游戏策划

    从本篇起,我们将进入实战环节,编写一个简单的第一人称射击游戏。在开始制作游戏之前,我们需要一份游戏策划。

    1. 游戏介绍:游戏场景中,会有若干个敌人的出生点,定时生成一些敌人。敌人会寻找并攻击主角。游戏的目的就是生存并消灭更多的敌人。

    2. UI界面:包括生命值、弹药数量、得分和准星。游戏失败后提供一个按钮重新开始游戏。

    3. 主角:由于是第一人称射击游戏,主角本身不会出现在视野范围内。屏幕上能够看到的是一把端在胸前的M16机关枪。按键盘的W、S、A、D来控制主角前后左右移动,移动鼠标旋转视角,点击鼠标左键射击。

    4. 敌人:敌人只有一种,具有智能寻路功能,可以躲避障碍物并攻击主角。

    二、游戏场景

    1. 在Assets目录下新建文件夹Scenes,将Unity创建的默认场景保存到Scenes文件夹下,并命名为demo.unity。

    2. 导入美术资源(解压后复制到Assets目录下),将rawdata/Level目录下的level.FBX添加到游戏场景中。

    3. 删除Unity自动创建的Directional Light,在菜单栏选择【GameObject】→【Light】→【Point Light】创建9个Point Light,均匀分布到level游戏体所在的空间,调节各自的灯光颜色、光照范围和光强。将每个光源的Baking属性设为Baked,以便进行灯光烘焙。

    4. 选中level游戏体,在Inspector窗口中勾选Static选项将level游戏体设置成静态物体,以便进行灯光烘焙。(一定要勾选!没有设置成Static的物体不会参与灯光烘焙)

    5. 在菜单栏选择【Window】→【Lighting】→【Scene】,勾选【Baked GI】。Baked Resolution和Baked Padding属性用于设置烘焙精度和烘焙像素间隔,值越大精度越高,需要的烘焙像素越多,需要的烘焙图数量可能也会增加。Compressed属性指示是否对最终生成的Lightmap进行压缩,可以大幅降低其大小,对于性能相对较差的硬件平台(比如手机)此项非常有用。Lighting窗口下方会显示出预计产生的Lightmaps的大小。点击Build开始烘焙灯光,等待烘焙完成。

    6. 保持选中level游戏体,选择【Add Component】→【Rendering】→【Light Probe Group】为level添加一个Light Probe Group(灯光探测器组),使用【Add Probe】命令创建灯光探测器,修改其位置。在我们的游戏场景中,光影效果较为简单,因而可以采取均匀分布的方法。在复杂的游戏场景中,大量创建Light Probe会对性能造成较大影响,此时可以采取的方法是在光影变化较为丰富的地方较为密集地布置Light Probes,在其他地方较为稀疏地布置少量Light Probes。更多有关Light Probes的布置方法,可以参考Unity圣典中的有关内容。布置完的效果如下图所示。

     

    7. 选择level游戏体下的三个模型,在Inspector窗口选择【Add Component】→【Physics】→【Mesh Collider】为它们添加多边形碰撞体。为了得到最精确的碰撞检测,可以直接使用模型本身进行碰撞检测,但因为在实际项目中,模型通常相对比较复杂,模型的外形多边形数量较大,这样做对性能会产生很大影响。比较常用的一种方法是使用一个与模型形状近似的碰撞模型,但尽可能简单,专门用来检测碰撞。这里我们就使用了这个技术。

    游戏场景到此就基本建立完毕了。从下一篇起我们将为这个第一人称射击游戏添加主角和敌人,并编写相应的脚本代码。所有的脚本均使用C#编写,关于C#语言,推荐一本Karli Watson等的著作《Beginning C#》(C# 入门经典),由浅入深,讲得很细致也很全面。

    展开全文
  • 上一节将UI简单的布置了一下,下面来实现UI...射击后子弹数减1,并且下面直接调用UI显示,这样就形成了数据绑定,使得UI的子弹数和脚本的子弹数保持一致 //弹夹内子弹数 [SerializeField] private int currentBull
  • -接上篇:unity3d学习(一)制作第一人称射击-玩家的视口和移动让玩家能够射击 第一步:通过射线发射 因为我们是第一人称射击,我们可以使用unity提供的ScreenPointToRay(),创建一个从摄影机开始发射的射线。一旦有...
  • Unity3d实战之Unity3d网络游戏实战篇(1):坦克构建 阅读文章前请细读以下几点: 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版。 本文是作者在学习过程中遇到的认为值得记录的点,因此引用的代码...
  • 学习Unity脚本推荐:Unity3D官网索引 首先创建脚本文件用来初始化瞄准镜,脚本CrossHairGUI源码如下: var crosshair = SwitchGUI(); var location = Location(); var noGuiStyle : GUIStyle; private var ...
  • 这一节内容比较简单,就是构建UI在摄像机屏幕上,让玩家可以看到人物的状态,血量,防弹衣,倒计时,金钱,子弹,准心 下面看一下效果图 最终效果是这样的,所有的布局全是用UGUI的TEXT组件添加的,需要注意的是...
  • 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1.2 资源导入1.3 山体系统1.4 灯光1.5 材质1.6 预设1.6.1制作预设1.6.2例子1.7 声音...
  • 转载自:2016-08-16 Unity官方本教程适合Unity新手或对Raycast不甚了解的开发者,主要介绍Raycast的用途并绘制出射击游戏的射线轨迹。本篇主要写子弹射击轨迹 红外线瞄准可以参考相关的参数设置最终效果 本课程包括...
  • QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming #1 场景搭建 1: 导入人物模型, 手持一把枪; 2: 导入碎片模型; 3: 创建一个平面; 4: 创建一个障碍物;...开枪射击 1...
  • https://blog.csdn.net/qq_26621551/article/details/52092635
  • 当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置一个十字瞄准器, 设想机对准的中心就是瞄准...
  • 在TPS第三人称射击游戏中,我们希望子弹从场景中的角色的枪口进行发射,而不是从摄像机或者玩家身体中,这样在视觉效果上,可以看到玩家的枪支开火 2.子弹飞行方向 相比于第一人称,第三人称就会面临一个问题,子弹...
  • Unity 射击练习(1)

    千次阅读 2013-07-15 16:00:07
    using UnityEngine; using System.Collections; [AddComponentMenu("Camera-Control/MouseLook")] public class MouseLook : MonoBehaviour { //枚举角色目标位置 public enum RotationAxes {MouseXAndY = 0,...
  • Mathf.Clamp public static float Clamp(float value, float min, float max); 参数 value:鉴于最小值和最大值之间的一个数 min:最小值 max:最大值 using System;...using System.Collections;...
1 2
收藏数 32
精华内容 12
关键字:

unity3d 射击准心