2019-09-03 22:06:47 weixin_44831924 阅读数 432
  • Unity3D实战入门之第三人称射击游戏(TPS)

    这是一套第三人称射击游戏开发的入门基础课程。 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对第三人称射击游戏入门,对后续复杂大中型3D游戏的开发有实际的借鉴意义。 这套课程,对初次接触3D射击类游戏的学习者而言,是一块极好的跳板。

    1752 人正在学习 去看看 伍晓波



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

中心准心

       中心准心指向屏幕中央。中心准心的坐标是固定的,假设屏幕宽度为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方法中绘制准心。
2019-12-18 22:49:50 zhunju0089 阅读数 61
  • Unity3D实战入门之第三人称射击游戏(TPS)

    这是一套第三人称射击游戏开发的入门基础课程。 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对第三人称射击游戏入门,对后续复杂大中型3D游戏的开发有实际的借鉴意义。 这套课程,对初次接触3D射击类游戏的学习者而言,是一块极好的跳板。

    1752 人正在学习 去看看 伍晓波

1.顶部菜单栏 Window>Asset Store 打开资源商店

2.搜索 fps microgame

3.下载并且导入 fps microgame

4.最后运行

 

2019-08-28 16:32:00 shenqiankk 阅读数 935
  • Unity3D实战入门之第三人称射击游戏(TPS)

    这是一套第三人称射击游戏开发的入门基础课程。 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对第三人称射击游戏入门,对后续复杂大中型3D游戏的开发有实际的借鉴意义。 这套课程,对初次接触3D射击类游戏的学习者而言,是一块极好的跳板。

    1752 人正在学习 去看看 伍晓波

知识点:

  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);   
    }
}
2014-10-26 20:24:47 u014749760 阅读数 1921
  • Unity3D实战入门之第三人称射击游戏(TPS)

    这是一套第三人称射击游戏开发的入门基础课程。 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对第三人称射击游戏入门,对后续复杂大中型3D游戏的开发有实际的借鉴意义。 这套课程,对初次接触3D射击类游戏的学习者而言,是一块极好的跳板。

    1752 人正在学习 去看看 伍晓波
unity3d 第一人称射击游戏 Demo
2013-11-20 20:12:45 huangfe1 阅读数 837
  • Unity3D实战入门之第三人称射击游戏(TPS)

    这是一套第三人称射击游戏开发的入门基础课程。 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对第三人称射击游戏入门,对后续复杂大中型3D游戏的开发有实际的借鉴意义。 这套课程,对初次接触3D射击类游戏的学习者而言,是一块极好的跳板。

    1752 人正在学习 去看看 伍晓波



那抱歉,上次那个Unity+kinect还没有更新,最近在深一步研究,不久将更新(绝对不负众望)!现在进入正题,十分钟带你打造unity3D第一人称射击游戏!

看完本篇博客,你将学会第一人称控制,粒子的添加,碰撞的检测,鼠标的监听,画2d图像,预制物体克隆,添加力,添加声音等等!(本篇博客假设你已经对unity稍微有点了解)

一,打开unity,创建一个场景,添加一个plane,(gameobject->createother->plane)。

二,添加虚拟第一人称任务(现在没搞模型,模型后面可以自己添加);Assert->importpackages->Charactercontroll,之后你将Project面板里面看到这个资源包,打开里面的charactercontroll文件,将里面的first Person controll拖动到合适的位置。

三,然后我们将添加一个虚拟的枪口,作为子弹的发生点!这个你可以创建一个椭圆,放在摄像机的最中间


 然后要将椭圆设置为摄像机的子物体,这样他将随着摄像机运动(不能设置为任务模型的子物体,因为任务模型的不能上下移动,也就不是这样后不能上下射击)。也就是在hierahcry面板中点击你创建椭圆,拖到摄像机上,这样他就成了摄像机的子物体。可以点击运行测试下,你会发现这东西只是虚拟枪口,所以我们设置它看不见,点击椭圆,在修改面板上,有个MeshRender,你单击下,椭圆就看不见了,但是它存在,然后再点击CapsuleColisder,取消他的碰撞(以免影响子弹的射击);
三,子弹的射击

我们首先创建一个圆,(用这个圆来模拟子弹,如果你自己有子弹模型,就用子弹模型),然后在project中创建一个prefab,用于之后的克隆子弹,现在我们来子弹一点火焰效果,Assert->importpackage->particles导入粒子,点击里面的fire,将里面的Flame拖到游戏中,位置和你创建的球(子弹)一样,然后将你设置的,然后同样的方法,将火焰设置为,子弹的子物体,这样,火焰将和子弹一起运动,自己在属性面板里 修改火焰的大小,然后将子弹拖到你创建的prefab中,修改prefab的名字为balls!添加一个刚体属性,Rigidbody(Addcomment->ragidbody)然后删除游戏中的子弹(嗯,删除)!现在子弹的预制物体已经创建好了,现在我们来射击!

四 ,点击鼠标,发生子弹

现在 就是敲代码码的时候了

var aim:Transform;
//克隆子弹
private var ball:Transform;
//绘制准星的材质
var material:Material;
function Start () {

}

function Update () {
//将鼠标的图标隐藏
Screen.showCursor=false;
//var zj=Vector3(Screen.width/2,Screen.height/2,0);
//var ray:Ray=Camera.main.ScreenPointToRay(Input.mousePosition);
//定义一个方向,为发射点y轴方向
var dir=aim.transform.TransformDirection(Vector3.up);
//var dir=ray.direction;
//按下鼠标左键
if(Input.GetMouseButtonDown(0)){
//实列化一个球,发射点的位置,
ball=Instantiate(balls,aim.position,Quaternion.identity);
//在某一个方向加一个力
ball.rigidbody.AddForce(dir.normalized*1000);
print("----------->>>");
//三秒后删除小球
Destroy(ball.gameObject,3);
}
}

 这里用到了,Screen.showCursor=false;将鼠标隐藏,要将他放在updatae中,放在start中不行var dir=aim.transform.TransformDirection(Vector3.up);这是定义一个方向,子弹将以这个方向射击

其他的没什么解释的了,注释很详细了,方法里面传入的参数,查一下API文档就行

五 ,现在们开始绘制准星

 

//绘制准星的材质

var material:Material;

先定义 一个材质,用来绘制图像

 

//绘制准星
function OnPostRender(){
DrawRecent(Screen.width/2,Screen.height/2,10,10);
}
//绘制四边形的方法
function DrawRecent(x:float,y:float,width:float,height:float){
//材质通道设置为默认的0
 material.SetPass(0);
 //绘制2D图形
  GL.LoadOrtho();
 //绘制长方体
 GL.Begin(GL.QUADS);
 //传入四个点的相对屏幕的坐标,先后分别是左上角,左下角,右下角,右上角
  GL.Vertex(new Vector3(x/Screen.width,y/Screen.height,0));
  GL.Vertex(new Vector3(x/Screen.width,(y+height)/Screen.height,0));
  GL.Vertex(new Vector3((x+width)/Screen.width,(y+height)/Screen.height,0));
  GL.Vertex(new Vector3((x+width)/Screen.width,y/Screen.height,0));
  //结束绘画
  GL.End();
}

 这个没什么好解释的,注释有,按照各个规则就是

 

然后就是,如果你射击到了敌人,敌人就着火

四,射击敌人

首先我们,创建几个cube,这个用来模拟敌人,如果你有好的模型,就用模型。给cube创建ridibody

然后给它一个标签,在属性面板上面有个Tag,点击,选择player,给个player标签,你也可以点击addTag自己添加一个Tag,现在我们创建一个prefab预制火火焰,创建一个空物体,将先前导入的fires拖到空物体中

将空物体放入prefab中,改名为fires

现在 我们添加碰撞事件

新建一个脚本,

 

#pragma strict
//预制火焰
var fires:Transform;
//克隆火焰
private var fire:Transform;
function Start () {

}

function Update () {

}//碰撞监听
function OnCollisionEnter(other:Collision){
//如果碰到的事cube(先前我们将cube的tag设置成了player)
if(other.transform.tag=="Player"){
//克隆一个火焰
fire=Instantiate(fires,other.transform.position,Quaternion.identity);
//设置火焰的父对象为箱子,这样火焰将和物体一起运动,
fire.transform.parent=other.transform;}
}

 五,你想加入声音嘛?如果你想,接着看两种方式添加音乐,首先添加背景音乐,点击摄像机,AddCommpent->aduio->aduiosource

 

首先 下载你需要的背景音乐,将音乐拖进Asset文件夹中,然后将音乐拖进刚才添加的aduiosource的中

然后 教你添加动作音效,在第一和代码中加入var music:AudioClip;

然后再发生子弹的那个方法中,AudioSource.PlayClipAtPoint(music,transform.position);播放,

六:挂载脚本

你首先将以第一个脚本,挂到摄像机上面,然后将第一个frefab(balls)拖到变量中

第二个脚本放在balls上,将fires和音乐拖到变量中!!

OK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 现在开火!!!!!!!!!

 

 

 

源码下载

unity3d射击类demo

阅读数 2541

没有更多推荐了,返回首页