2019-09-03 22:06:47 weixin_44831924 阅读数 868
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。



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

中心准心

       中心准心指向屏幕中央。中心准心的坐标是固定的,假设屏幕宽度为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方法中绘制准心。
2015-09-01 17:41:17 wuyt2008 阅读数 1786
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

开始学习unity3d游戏制作。


using UnityEngine;

public class PlayerController : MonoBehaviour
{
	/// <summary>
	/// The current touch positon.
	/// </summary>
	private Vector3 cTP = new Vector3 ();
	/// <summary>
	/// The start touch position.
	/// </summary>
	private	Vector3 sTP = new Vector3 ();
	/// <summary>
	/// The start transform position.
	/// </summary>
	private Vector3 sTfP = new Vector3 ();
	
	/// <summary>
	/// Update is called once per frame
	/// </summary>
	private	void Update ()
	{
		if (Input.touchCount == 1) {
			//current Touch
			Touch cT = Input.touches [0];
			if (cT.phase == TouchPhase.Moved) {
				cTP = Camera.main.ScreenToWorldPoint (cT.position);
				transform.position = new Vector3 (
					cTP.x - sTP.x + sTfP.x,
					cTP.y - sTP.y + sTfP.y,
					sTfP.z);
			} else if (cT.phase == TouchPhase.Began) {
				sTP = Camera.main.ScreenToWorldPoint (cT.position);
				sTfP = transform.position;
			}
		}
	}
}


示例代码:http://download.csdn.net/detail/wuyt2008/9071187

2019-07-17 08:47:27 shiliang97 阅读数 198
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

游戏封面
游戏封面
 

B站游戏视频:体感游戏 热狗vs篮球(CXK)kinect连接unity3d入门demo 

游戏页面截图
游戏截图
 

 

 通过制作这个游戏学习unity3d制作,使用官方自带 Space Shooter 教程

重要的话说在前头

  1. 参考博客:对 Unity 太空射击游戏的实践
  2. B站熟肉教学视频:unity3d官方案例_太空射击【unity官方案例精讲】
  3. 我的游戏视频:体感游戏 热狗vs篮球(CXK)kinect连接unity3d入门demo
  4. unity3d的kinect包:链接: https://pan.baidu.com/s/1RZSHG-UZ9jXZ_HfQuomzYw 提取码: qg14
  5. kinect2.0SDK:Kinect for Windows SDK Beta 2
  6. unity3d下载:https://unity.cn/releases
  7. 游戏素材包GitHub链接:对 Unity 太空射击游戏的实践
  8. 超好听的BGM:只因你太美

老手,看完这里你就已经可以撤了。

飞机贴图
标题子弹贴图
篮球贴图
 

再拿好这三张材质图,会改的也可以离开了 

由于篇幅原因kinect连接放到下一篇博客去讲。(下面?为默认的鼠标键盘操纵版)

新手可以接着往下看

环境配置

1. 按照教程走可以做出官方demo spaceshoot。

  1. 参考博客:对 Unity 太空射击游戏的实践
  2. B站熟肉教学视频:unity3d官方案例_太空射击【unity官方案例精讲】

2.需要装好unity开发环境

unity3d下载:https://unity.cn/releases 

3.同时准备好素材包,也可以从unity商店下载(搜索spaceshoot)免费下载

游戏素材包GitHub链接:对 Unity 太空射击游戏的实践

(选修)如果拥有微软的kinect硬件,可以安装kinect,安装时注意,电脑不要连接kinect

  1. unity3d的kinect包:链接: https://pan.baidu.com/s/1RZSHG-UZ9jXZ_HfQuomzYw 提取码: qg14
  2. kinect2.0SDK:Kinect for Windows SDK Beta 2

 游戏修改,注入灵魂

按照官方的教程走完,你已经写出了普通的飞机大战小游戏。

注入灵魂使用下列贴图

1.使用篮球替换陨石

篮球贴图

 

在陨石物体后面之间增加一个3D的球体。 

 

 

 勾选掉MeshRenderer(原理大概是这个陨石还是没有变,物体还在,只是肉眼看不见了),之后就可以换成一个篮球(只是肉眼可见,实际上不存在,不是刚体,实际碰撞的还是陨石的模型,这样不需要再修改参数比较简单)。

贴上篮球贴图,灵魂注入已经完成了一半。 

2.热狗替换子弹

请使用ps等工具将图片扣掉白色背景,保存成tif格式导入unity中。

创建spirt(支持透明图片),和上步替换陨石一致,替换子弹贴图。

 

 

 

 

 

 

3.王校长替换飞机

同理第二步

 

 

4.声音替换

请下载相应bgm如:只因你太美

请转成wav文件格式导入在线转换wav网站

飞船爆炸时会出现爆炸特效,?故直接在爆炸特效出现时播放相应bgm即可。

 

 

进入编辑界面,直接拖入BGM,记得勾选Play On Awake

 

5.如果你喜欢的话,背景也可以换个喜欢的。

 

到此为止,你已经可以体验自己编写的小游戏了,由于篇幅原因kinect连接放到下一篇博客去讲。

 喜欢我的博客别忘了,收藏点赞关注我哦!!!!!---一个永远在路上的菜鸡萌新。

 

 

2017-02-26 11:58:30 jessssion 阅读数 7231
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

玩家的视口和移动

写在前面:
- 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking
- 内容:第二章
- 下一篇:unity3d学习(二)制作第一人称射击-玩家射击和添加敌人


构建简单场景

第一步:在unity5中创建一个新场景,选择File|New Project。
第二步:利用unity自带的组件制作一个简单的场景,如下图:
简单场景
中间是一个胶囊(capsule),表示玩家。
第三步:设置玩家
1、把玩家(胶囊)的 碰撞检测器capsule collider移除,添加一个character controller(Inspector底部有个Add Component按钮)。
2、相玩家附加一个摄影机(camera)作为玩家的眼睛(可以把主摄影机直接拿来附加)。附加后建议摄影机设置的位置为0,0.5,0,重置rotation为0,0,0。

添加脚本

第一步:向玩家添加鼠标输入能观察四周的脚本
创建一个名为MouseLook脚本,代码如下:
using UnityEngine;
using System.Collections;

public class MouseLook : MonoBehaviour {
    //定义枚举数据结构,将名称和设置关联起来
    public enum RotationAxes
    {
        MouseXAndY = 0,
        MouseX = 1,
        MouseY = 2
    }
    public RotationAxes axes = RotationAxes.MouseXAndY;
    public float sensitivityHor = 9.0f;//水平旋转的速度
    public float sensitivityVert = 9.0f;//垂直旋转的速度
    public float minimumVert = -45.0f;//垂直旋转的最小角度
    public float maximumVert = 45.0f;//垂直旋转的最小角度

    private float _rotationX = 0;//为垂直角度声明一个私有变量

    void Start()
    {
        //将光标锁定到游戏窗口的中心。
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update ()
    {
        if (axes == RotationAxes.MouseX)
        {
            //水平旋转代码
            transform.Rotate(0,Input.GetAxis("Mouse X") * sensitivityHor, 0);
        }
        else if (axes == RotationAxes.MouseY)
        {
            //垂直旋转代码
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
            _rotationX = Mathf.Clamp(_rotationX,minimumVert,maximumVert);

            float rotationY = transform.localEulerAngles.y;//保持y轴与原来一样
            transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
        }
        else
        {
            //水平且垂直旋转
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
            _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);//限制角度大小

            float delta = Input.GetAxis("Mouse X") * sensitivityHor;//设置水平旋转的变化量
            float rotationY = transform.localEulerAngles.y+delta;//原来的角度加上变化量
            transform.localEulerAngles = new Vector3(_rotationX,rotationY,0);//相对于全局坐标空间的角度
        }

        //当点击esc后
        if (Input.GetKeyDown("escape"))
        {
            Cursor.visible = true;
            Cursor.lockState = CursorLockMode.None;
            //Cursor.lockState = CursorLockMode.Confined;//将光标限制在游戏窗口。
        }
        if (Input.GetButtonDown("Fire1"))
        {
            Cursor.visible = false;
            Cursor.lockState = CursorLockMode.Locked;
        }
    }
}
第二步:给玩家和摄影机添加脚本
先把脚本挂到玩家身上可以选择玩家,设置Inspector面板axes枚举变量,看看三个状态下的不同效果。
如果选择MouseXAndY,发现玩家可以飞行。所有我们可以把玩家的axes值设置为MouseY,使它能够水平旋转,然后向摄影机添加一个MouseLook脚本,设置axes值设置为MouseX,使它垂直旋转。
第三步:创建玩家移动脚本 FPSInput
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]//RequireComponent表示此物体需要有 CharacterController才能运行此脚本,否则会报错
[AddComponentMenu("Control Script/FPS Input")]//AddComponentMenu表示脚本将在unity编辑器中添加组件菜单。以后想添加FPSInput脚本,可以在AddComponent中添加
public class FPSInput : MonoBehaviour {

    public float speed = 1f;
    public float gravity = -9.8f;

    private CharacterController _charController;

    void Start()
    {
        _charController = GetComponent<CharacterController>();
    }

    void Update ()
    {
        float deltaX = Input.GetAxis("Horizontal")*speed;
        float deltaZ = Input.GetAxis("Vertical") * speed;
        //transform.Translate(deltaX*Time.deltaTime, 0, deltaZ * Time.deltaTime);//此方法直接相对于本体移动

        Vector3 movement = new Vector3(deltaX,0, deltaZ);//此处是相对于本体的坐标
        movement = Vector3.ClampMagnitude(movement, speed);//限制向量的最大长度,并返回此变化后的向量
        movement.y = gravity;

        movement *= Time.deltaTime;
        movement = transform.TransformDirection(movement);//转换为世界坐标系

        _charController.Move(movement);//move()是现对与世界坐标系移动物体的。
    }
}
第四步:给玩家添加脚本,并且看看效果

总结

  • 1、Input.GetAxis(“Mouse X”):获取鼠标延左右移动的速度
  • 2、Input.GetAxis(“Mouse Y”):获取鼠标延上下移动的速度
  • 3、Input.GetKeyDown(“escape”):按下esc键
  • 4、transform.Rotate():使物体旋转,如果最后一个参数relativeTo默认以局部坐标旋转,如果设置为-Space.World(世界坐标系),则旋转应用于世界x,y,z轴。
  • 5、transform.localEulerAngles:物体的欧拉角(相对于父级的坐标),此例子我们直接改变物体的欧拉角以达到旋转的效果。和用transform.Rotate()改变有所区别
  • 6、Mathf.Clamp():
  • 7、Cursor.lockState = CursorLockMode.Locked;将光标锁定到游戏窗口的中心。
    Cursor.lockState = CursorLockMode.Confined;将光标限制在游戏窗口。
  • 8、Cursor.visible = false;隐藏光标
  • 9、CharacterController:CharacterController类。CharacterController允许你简单地做碰撞约束的移动,而不必处理刚体。
  • 10、CharacterController.Move():通过运动移动控制器,并且受碰撞约束,会延着碰撞体表面滑动,它不受重力影响。(相对于世界坐标系来移动物品)
  • 11、transform.TransformDirection():转换为世界坐标系
  • 12、Vector3.ClampMagnitude():限制一个向量的最大长度。

注意:很多类和方法不清楚请查看官方文档

2013-11-20 20:12:45 huangfe1 阅读数 1059
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。



那抱歉,上次那个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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 现在开火!!!!!!!!!

 

 

 

源码下载

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