2019-12-18 22:49:50 zhunju0089 阅读数 61
  • Unity3D实战入门之第三人称射击游戏(TPS)

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

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

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

2.搜索 fps microgame

3.下载并且导入 fps microgame

4.最后运行

 

2018-02-05 06:46:34 qq_21652921 阅读数 3948
  • Unity3D实战入门之第三人称射击游戏(TPS)

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

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

最近有许多朋友问到我一个问题,如何实现像战地,使命召唤那样逼真的射击体验。首先我们要知道,在没有动画师的帮助下,要想实现人为模拟的后坐力,精准度偏移等等其实并不是什么难事,今天我们就来用较简短的代码来实现一个模拟的枪械后坐力。

首先是我们需要用到的工具类代码:

public class Spring3
{
	public Vector3 value = Vector2.zero;
	private Vector3 dampValue = Vector2.zero;
	private float damp = 1;
	private float frequence = 1;
 	public void Clear ()
	{
		value = Vector2.zero;
		dampValue = Vector2.zero;
	}
	public Spring3 (float damp, float frequence)
	{
		this.damp = damp;
		this.frequence = frequence;
	}
	public void Update (float deltaTime, Vector3 target)
	{
		value -= dampValue * deltaTime * frequence;
		dampValue = Vector3.Lerp (dampValue, value - target, deltaTime * damp);
	}
}
	public class SpringEulerAngle
	{
		public Vector3 value = Vector2.zero;
		private Vector3 dampValue = Vector2.zero;
		private float damp;
		private float frequence = 1;


		public SpringEulerAngle (float damp, float frequence)
		{
			this.damp = damp;
			this.frequence = frequence;
		}


		public void Clear ()
		{
			value = Vector2.zero;
			dampValue = Vector2.zero;
		}


		public void Update (float deltaTime, Vector3 target)
		{
			value -= dampValue * deltaTime * frequence;
			dampValue = eulerLerp (dampValue, value - target, deltaTime * damp);
		}


		public static Vector3 eulerLerp(Vector3 left, Vector3 right, float t){
			Vector3 ret;
			ret.x = Mathf.LerpAngle (left.x, right.x, t);
			ret.y = Mathf.LerpAngle (left.y, right.y, t);
			ret.z = Mathf.LerpAngle (left.z, right.z, t);
			return ret;
		}
	}
这是我们在进行模拟时最常用的一个算法,我称之为弹簧算法(实在起不出好名字了嘿嘿),算法非常简单,我们只需要把自己的value输入进去,作为希望插值的目标,然后调用Update函数就可以让value以弹性姿势像target靠拢,需要注意的是damp和frequency这两个浮点数的用处,可以看到damp越高插值速率越高,越快的趋近于目标点,而frequency越高弹簧震动的越快,我们在之后的模拟中会用到这两个值的。

通过使用弹簧算法,我们可以很轻松的实现一个让抬起的枪口归位的动作,那么我们怎么实现一套完整的后坐力弧线呢。要知道我们在开枪的时候(去过射击场的朋友应该知道),枪口是呈现一个类似抛物线的运动,在扣动扳机瞬间枪口迅速上抬,随即在胳膊与胸口的压力下枪的上抬幅度慢慢降低并开始下降,降到开枪前的点,所以我们需要在代码中模拟这一系列动作。

这时有同学就会问了,直接把摄像机或者枪的transform.eulerAngles绑到上边代码中的value不就行了么,这期教程不就可以结束了么,如果这样想我只能说这位同学有些失了智,有灵性的同学应该已经发现了问题,单纯通过一个弹簧,只能模拟枪口归位,但是枪口上抬这个过程就只能强行进行角度偏移,就没法实现我们说过的抛物线效果。所以我们应该用另一个插值来模拟一整套后坐力。将以下脚本挂载到枪或摄像机上,即可触发后坐力。

明白了道理以后,就非常容易实现了,我们这里写一段非常简单的代码,通过点击鼠标左键触发,给目标加一段随机的角度,并且实现一个抛物线性质的偏移,注意,因为后坐力控制属于物理运动,所以应该放在FixedUpdate中执行,FixedUpdate与Update的执行关系这里就不赘述了。

public class Recoil : MonoBehaviour {
	SpringEulerAngle recoilTarget;
	public float damp = 20;
	public float frequence = 15;
	void Awake(){
		recoilTarget = new SpringEulerAngle (damp, frequence);
	}
	
	// Update is called once per frame
	void FixedUpdate () {
		recoilTarget.Update (Time.deltaTime, Vector3.zero);
		transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (recoilTarget.value), 0.75f);	//这里使用一个较大的插值数字以实现枪口的迅速抬升
	}

	void Update(){
		if (Input.GetMouseButtonDown (0)) {
			recoilTarget.value = new Vector3 (Random.Range (-20, 0), Random.Range (-3, 3), 0);	//这里做一个随机偏移来模拟后坐力。
		}
	}
}
将这段控制后坐力的代码保存为Recoil.cs并且挂载到摄像机或者模型上,运行点击左键就可以看出效果,只不过要想实现自己理想的后坐力,需要通过不停的调参来获得令自己满意,令策划满意的效果。

2014-09-09 15:28:47 yangyisen0713 阅读数 1186
  • Unity3D实战入门之第三人称射击游戏(TPS)

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

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

首先,下载ZXing.Net.0.12.0.0.zip。下载地址为:http://zxingnet.codeplex.com/

然后在下载的文件中找到unity文件夹,把文件夹整体拖到新的unity的Project中,然后新建c#脚本,这里命名为“显示二维码”,然后把这个脚本拖入Main Camera中,运行即可。如图所示:




2015-03-10 15:30:07 operhero1990 阅读数 1160
  • Unity3D实战入门之第三人称射击游戏(TPS)

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

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

Unity4.3游戏开发项目实战(龚老师编著)第二章太空射击

 

1、摄像头:透视投影Perspective和正交投影Orthographic的区别。这是个2D游戏,所以选择后者。

2、碰撞检测:游戏里飞机发射子弹击碎岩石,岩石撞碎飞机都需要用到碰撞检测。

      碰撞检测过程中需要为撞击与被撞击物体加上碰撞体。子弹使用胶囊碰撞体(CapsuleCollider),飞机和岩石使用立方体碰撞体(Box Collider),并且勾选Is Trigger选项。

      撞击者(攻击方)需要添加刚体(Rigidbody)。

      撞击响应函数这里使用的是void OnTriggerEnter(Collider other),其中用other.tag == "Player"(飞机的tag是Player)来判断是否碰撞到了飞机,而projectile则是子弹。 http://blog.csdn.net/Monzart7an/article/details/22739421这篇文章详细分析了碰撞检测。

3、动画:岩石被击碎和飞机爆炸都会有爆炸动画。岩石爆炸总共有7帧图像,打包成一幅308*49的图片。所以可以设置Tiling属性的X=0.143表示只显示原图X轴的七分之一,而改变Offset中的X则可显示不同帧画面。这里直接贴代码:

using UnityEngine;
using System.Collections;

public class ExplosionController : MonoBehaviour {

	public int index = 0;
	public int frameNumber = 7;

	float frameRate = 0;
	float myTime = 0;
	int myIndex = 0;

	// Use this for initialization
	void Start () {
		frameRate = 1.0f / frameNumber;	
	}
	
	// Update is called once per frame
	void Update () {
		myTime += Time.deltaTime;
		myIndex = (int)(myTime * frameNumber);
		index = myIndex % frameNumber;

		renderer.material.mainTextureScale = new Vector2 (frameRate, 1);
		renderer.material.mainTextureOffset = new Vector2 (index * frameRate, 0);

		if (index == frameNumber - 1) {
						Destroy (gameObject);
				}
	}
}

4、记录最高分数:其实就是保存和读取一个变量到本地。这里使用的是PlayerPrefs.SetInt("highScore")和PlayerPresf.GetInt("highScore")的方法,u3D会将变量名和值保存为键值对的形式。

5、切换场景:首先定义不同的场景(New Scene),调用Application.LoadLevel("场景名”)。

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

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

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



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

中心准心

       中心准心指向屏幕中央。中心准心的坐标是固定的,假设屏幕宽度为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方法中绘制准心。

unity3d 第一人称射击游戏 Demo

博文 来自: u014749760

unity3d简单射击游戏

阅读数 1160

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