2019-01-22 10:18:24 qq_43650522 阅读数 4570

Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓。但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备。怎么学unity3d游戏开发?
首先要了解U3D最重要的五大界面:
第一:场景(Sence),构建游戏的地方;
第二:层级(Hierarchy),场景中的游戏对象都列在这里。
第三:检测面板(Inspector),当前选中的资源或对象的设置,是一些变量和组件的集合。
第四:游戏(Game),演示窗口,仅在播放模式中演示。
第五:项目 (Project),一些资源的列表,和库的概念一样。在这里插入图片描述
然后了解主菜单栏的八大菜单:文件(File),编辑(Edit),资源(Assets),游戏对象(GameObject),组件(Component),地形(Terrain),窗口(Window),帮助(Help),熟悉这些菜单每一个命令对以后的游戏制作大有帮助。
在U3D中,一定要对坐标(Coordinates)有个了解,U3D的坐标点是以(x,y,z)的顺序排列的,切记。熟悉坐标,在做游戏的过程中会更加顺手。
游戏行业一波未平一波又起,井喷式的发展已经不是一年两年了,从端游到页游在到现在的手游,游戏发展的趋势也呈现一片大好的形势。最近很火的阴阳师不是据说给开发部发了5年工资吗?上线一周赚了十亿。所以说,目前来讲,游戏开发前景肯定不弱。
同时,我国政府大力扶持游戏产业,特别是对我国本土游戏企业的扶持。除此之外,我国政府各部门还采取了各种各样的形式来帮助发展游戏行业。目前国内游戏行业的从业人员大约为6万人左右,而全国需求多达30万人,未来几年缺口会更大。
游戏开发工程师是众多游戏企业愿意高薪聘请的人才,我们可以到招聘网站上查看下,一个实习游戏开发工程师月薪都在5000-8000元。全国也只有极少部分高校开设了游戏专业,所以游戏开发人才在市场上身价就更高。
因此现在绝对是加入到unity3d游戏开发学习的绝佳时机。希望对大家能有所启发~

2017-04-25 19:36:23 Joinl 阅读数 1020

射线(ray)是指由线段的一端无线延长所形成的直线。


射线多用于检测 在 Unity 中描述一个射线一个点加个方向,在与其他物体发生碰撞时将停止发射。

  • Ray 射线类。
    Ray类
    创建一个射线:
using UnityEngine;
using System.Collections;

namespace GaoSan{
    public class RayTest : MonoBehaviour
    {
        public Transform ori;//起点位置
        public Transform des;//终点位置
        void Update ()
        {
            // (des.position - ori.position) 终点位置减去 起点位置 等于方向向量
            Ray ray = new Ray(ori.position, (des.position - ori.position));
            // 输出检测
            print(ray);
        }

RayTest 脚本拖到摄像机中。在 Hierarchy 面板上创建两个 Cube ,Transform组建Reset ,将这两个Cube分别表示 ori 和 des,des Z轴改为10点击运行。运行结果
为什么输出的 Dir :(0.0, 0.0, 1.0)呢?
当我们传入一个方向数值时Unity会自动将它转换成一个单位向量

  • 射线看不到,在 Debug 中有两种方法可以让开发者在 Scene 视图中观察到射线。
    1. Debug.DrawLine(Vector3 start, Vector3 end);此方法有四个重载。(传入的是两个顶点)
    2. Debug.DrawRay(Vector3 start, Vector3 dir);此方法有四个重载。(传入的是一个顶点和一个带长度的方向)

可以在 RayTest 代码中继续写:

 //参数:ray.origin 射线起点;ray.direction * 10 带长度的方向
   Debug.DrawRay(ray.origin, ray.direction * 10);

运行结果:
射线



射线检测

Physics.Raycast(有16个重载)

射线检测及投射一条射线在碰到物体时反馈一些信息。检测碰撞是基于 Collider ,射线检测是由物理发射出去的。

1. bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)

在场景中投下可与所有碰撞器碰撞的一条光线。返回值 bool 类型

2. bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)

在场景中投下可与所有碰撞器碰撞的一条光线。返回 (RaycastHit) 射到的物体信息(前提是返回 true)

3. bool Physics.Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, LayerMask.GetMask(params string[] layerNames))
在场景中投下可与指定层的所有碰撞器碰撞的一条射线。LayerMask 结构体;GetMask()指定层的名称。

Parameters:(参数)

1. origin :——- 在世界坐标,射线的起始点。
2. direction :— 射线的方向。
3. distance : —-射线的长度。
4. hitInfo : ——如果返回 ture ,hitInfo 将包含碰撞器碰撞的信息 。
5. layerMask : –只选定 LayerMask 层内的碰撞器,其它层内碰撞器忽略。
out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的信息。

小知识

1. Camera.main.ScreenPointToRay(Vector3 pos);

创建一条以摄像机的近裁剪面上的一点为起点,经过鼠标对应世界坐标的射线。

2.Camera.main.ScreenToWorldPoint(Vector3 position );

将某一个屏幕坐标点转换成摄像机看见的世界坐标位置。传入的Vector3类型参数的z值指定了世界坐标距离摄像机的距离。

3.Camera.main.ViewportPointToRay(Vector3 pos);

创建一条以摄像机的近裁剪面上的一点为起点,到摄像机视口之内指定的一个点。

例题

在场景的视野中有一些有碰撞器的物体,当鼠标放在物体表面上时,按下鼠标左键,改变该物体的颜色。

using UnityEngine;
using System.Collections;

namespace GaoSan{
    public class RaycastTest : MonoBehaviour
    {
        void Update ()
        {
            // 创建一条以摄像机的近裁剪面上的一点为起点,经过鼠标对应世界坐标的射线。
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Input.GetMouseButtonDown(0))
            {
                if (Physics.Raycast(ray,out hit,100,1<<9))
                {
                    hit.transform.GetComponent<MeshRenderer>().material.color = Color.red;
                }
            }
        }
    }
}

当点击鼠标左键时,从摄像机的近裁剪面上的一点为起点,经过鼠标对应世界坐标的射线。射线长度为100,射线碰撞层级为9,(1<<9表示开启Layer9而0<<9表示关闭Layer9)其它层级忽略。(也就是说只有物体处于层级9才能被射线检测到。)

层级
创建三个物体,新建三个层级分别为8,9,10。把Plane、Cube和Sphere三个物体层级分别设置为8,9、10。脚本放到摄像机上点击运行,分别单机这三个物体,会发现只有Cube 会被改变颜色。
运行后的结果Cube

http://download.csdn.net/detail/joinl/9835051

2016-11-11 22:34:29 u013628121 阅读数 446

推荐使用     LayerMask  代替 int表示层级,这样就可以在面板上多选了

public LayerMask obstacleMask;

Physics.Raycast(射线,碰撞体信息,射线长度多少米,要检测的碰撞层)

Physics.Raycast(起点,方向,碰撞体信息,射线长度多少米,要检测的碰撞层)

两种常用射线方法:
    A:从鼠标发射射线

if (Input.GetMouseButtonDown(0))
{
    //从摄像机到鼠标位置的一条射线
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit; //碰撞体信息
    if (Physics.Raycast(ray, out hit, 81f))
    {
        //碰撞到的点 hit.point 
        //碰撞到的物体  hit.transform.gameObject
    }
}

    B:从物体的某个方向发射,下面的是从角色下方发射81米长的射线 

​
RaycastHit hit; //碰撞体信息
//Physics.Raycast(起点,方向,碰撞体信息,射线长度多少米,要检测的碰撞层)
if (Physics.Raycast(transform.position, Vector3.down,out hit,  81f))
{
	//碰撞到的点 hit.point 
	//碰撞到的物体  hit.transform.gameObject
}

​

​

 下面代码演示了 射线只与地面层碰撞检测

​//从摄像机到鼠标位置的一条射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit; //碰撞体信息
int groundLayer = LayerMask.GetMask("Ground"); //要碰撞的层,得到地面layer层级
//Physics.Raycast(射线,碰撞体信息,射线长度多少米,要检测的碰撞层)
if (Physics.Raycast(ray, out hit, 81f, groundLayer))
{
	//碰撞到的点 hit.point 
	//碰撞到的物体  hit.transform.gameObject
}

​

 求射线穿过物体起点坐标和终点坐标?

求终点方法 从dis距离处 反向发射射线 ,一直碰到第一次正面碰到的物体,否则dis距离减一

缺点:dis越远 消耗的运行时间越长 达到3秒以上.

using System;
using System.Collections;
using UnityEngine;
public class Test12 : MonoBehaviour
{
    public Transform SendPos;
    public Transform endPos_Obj;
    public Transform startPos_obj;

    void SendRay(Vector3 pos,Vector3 dir, Action<RaycastHit> onHit)
    {
        var raycast = default(RaycastHit);
        var rey = new Ray(pos, dir);
        var isHit = Physics.Raycast(rey, out raycast, 2000f);
        Debug.DrawRay(SendPos.position, dir, Color.green);
        if (isHit)
        {
            Debug.DrawLine(SendPos.position, raycast.point, Color.red);
            onHit(raycast);
        }
    }

    //求终点方法 从dis距离处 反向发射射线 ,一直碰到第一次正面碰到的物体,否则dis距离减一

    private string start_nameHit;
    private string end_nameHit="";
    private float dis = 250f;
    IEnumerator FindBackPos()
    {
        do
        {
            var pos = startPos_obj.position + SendPos.up * dis;
            SendRay(pos, -SendPos.up, x =>
            {
                end_nameHit = x.transform.name;
                if (end_nameHit != start_nameHit)
                {
                    dis -= 1f;
                }
                else
                {
                    endPos_Obj.position = x.point;
                }
            });
            yield return new  WaitForEndOfFrame();
        } while (end_nameHit != start_nameHit);
    }
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        SendRay(SendPos.position, SendPos.up, y =>
        {
            startPos_obj.position = y.point;
            start_nameHit = y.transform.name;
            StartCoroutine(FindBackPos());
        });

        Debug.DrawLine(SendPos.position, SendPos.position+SendPos.up*500,Color.green);
    }
}

 

为飞鸟装上自动导航仪

小鸟在空间中自由飞翔,不会撞到障碍物,通过射线 探测环境 从而避障,

也可以用在鱼类

using UnityEngine;

public class Fly : MonoBehaviour
{
    /// <summary>
    /// 自身的大小半径
    /// </summary>
    public float boundsRadius = 2.5f;
    //射线的探测距离
    public float collisionAvoidDst = 1f;

    public float speed = 3f;
    /// <summary>
    /// 探测碰撞层,墙体 树啊等
    /// </summary>
    public LayerMask obstacleMask;
    void Awake()
    {
        CacularAngle();
    }
    // Update is called once per frame
    void Update()
    {
        Vector3 dir = ObstacleRays();
        transform.position += dir * speed * Time.deltaTime;
        transform.forward = dir;
    }

    const int numViewDirections = 300;
    public static  Vector3[] rayDirections;

    /// <summary>
    /// 求出球体 中心 到 边缘 300度 3D 向量,分割3D圆的角度
    /// </summary>
    static void CacularAngle()
    {
        rayDirections = new Vector3[numViewDirections];
        float goldenRatio = (1 + Mathf.Sqrt(5)) / 2;
        float angleIncrement = Mathf.PI * 2 * goldenRatio;
        for (int i = 0; i < numViewDirections; i++)
        {
            float t = (float)i / numViewDirections; //0到1的距离
            float inclination = Mathf.Acos(1 - 2 * t);
            float azimuth = angleIncrement * i;
            float x = Mathf.Sin(inclination) * Mathf.Cos(azimuth);
            float y = Mathf.Sin(inclination) * Mathf.Sin(azimuth);
            float z = Mathf.Cos(inclination);
            rayDirections[i] = new Vector3(x, y, z);
        }
    }

    /// <summary>
    /// 求没有障碍物的方向:从物体的前方以一定的角度递增,直到找到一个没有被阻挡的方向
    /// </summary>
    /// <returns></returns>
   Vector3 ObstacleRays()
   {
       Vector3[] rayDirections = BoidHelper.directions;

       for (int i = 0; i < rayDirections.Length; i++)
       {
           Vector3 dir = transform.TransformDirection(rayDirections[i]);
           Ray ray = new Ray(transform.position, dir);
           Debug.DrawRay(transform.position, dir,Color.red,0.5f);
           if (!Physics.SphereCast(ray, boundsRadius, collisionAvoidDst, obstacleMask))
           {
               Debug.DrawRay(transform.position, dir, Color.green, 0.5f);
               return dir;
           }
       }
       return transform.forward;
   }

}

 

2014-09-15 16:36:11 jiangyongyuan 阅读数 137

Unity3D学习笔记——组件之Effects(效果/特效)——Particle System(粒子系统) - 有情怀的人

Effects: 效果/特效。

Particle System: 粒子系统。可用于创建烟雾、气流、火焰、涟漪等效果。

在Unity3D 3.5版本之后退出了新的shuriken粒子系统: 

 

添加组件之后的效果: 

   

其中的Open Editor按钮可以打开粒子编辑器,用于编辑复杂的粒子效果。

由于shuriken粒子系统是模块化的管理方式,所以可以动态的添加模块:

1.初始化模块:此模块是效果组件固有的模块。

Duration:粒子发射器,发射粒子的时间。单位为S(秒)。

Looping:是否开启。如果开启了循环,Duration值只要大于最小值0.10即可。

Prewarm:是否开启预热。只有在开启的循环的时候,预热才有效果,粒子量相似发射了一个粒子周期。

Start Delay:预热延迟。游戏开始多长时间后,预热开启。单位为S。 

Start Lifetime:粒子从发射器出来,到消失的时间。单位为S。 

Start Speed:粒子发射的速度。

Start Size:粒子大小。

Start Rotation:粒子的旋转角度。

Start Color:粒子的颜色。

Gravity Multiplier:设置重力对粒子的影响,数值越大影响越大。

Inherit Velocity:速度继承。当粒子系统是运动的时候,粒子的速度会继承运动的速度。但粒子坐标系必须在世界坐标系。 

Simulation Space:坐标系是本身还是世界坐标系。

Play On Awake:在游戏开始播放,但不影响Start Delay效果。

Max Particles:粒子释放的最大数量,当达到最大数量时,停止释放粒子,当有粒子消失时继续释放。

2.Emission Module(粒子发射模块)用于粒子发射的速率。或是某个特定时间发射大量的粒子,用于模拟爆炸的效果。

每秒发射粒子数量。Bursts为某个时间点爆发出粒子的数量,这个时间必须在粒子Duration范围内。

每米发射粒子数量。粒子发射器所在的游戏对象,移动的时候每米发射的粒子,但粒子坐标系必须在世界坐标系。

3.Shape Model(形状控制模块):定义了粒子发射器的形状,位置及发射方向。

球形粒子发射器:

Radius:球形的半径。

Emit from Shell:是否从表面发射粒子,还是从内部发射。

Random Direction:是否启用随机速度。

半球发射器:

锥体发射器:

Angle:椎体,上边开口的大小。

Radius:半径的大小。 

Length:椎体的高度。只有当Emit from 值为Volume Shell或是Volume时可用。

Emit From:粒子发射的位置。

——————Base:粒子发射源在椎体的内部的底面上,由底面开始发射。

——————Base Shell:粒子发射源在椎体底面的边缘,就是周长那一圈发射。

——————Volume:粒子发射源在椎体内部空间。

——————Volume Shell:粒子发射器在椎体整个表面上。没有底面。

立方体发射器:

Box X:立方体长度。

网格发射器:

Mesh:选择网格样式。

——————Vertex:粒子将从网格顶点发射。

——————Edge:粒子将从网格边缘(棱)发射。

——————Triangle:粒子将从网格的三角面发射。图形都是三角形组成的。

4.生命周期速度模块:控制每一个粒子的速度。

5.生命周期速度限制模块:

Separate Axis:是否启用限制每一个轴。

Speed:限制的速度。

Dampen:阻尼。阻尼为1的时候表示在生命周期结束的时候,速度降到限定的速度。

6.生命周期作用力模块:控制每一个粒子在生命周期内受到力的情况。

Randomize: 只有在 Random Between Two Constants或Random Between Two Curves时才可启用。

表示每一帧作用在粒子上的力是均匀随机产生的。 

7.生命周期颜色模块:控制每一个粒子在生命周期内颜色的变化。

8:速度范围颜色变化控制模块:根据设置速度的范围和粒子的速度来改变粒子的颜色。

9:生命周期粒子大小模块:控制每个粒子在生命周期内,大小的变化。

10: 速度范围粒子大小变化控制模块:根据速度的变化改变粒子的大小。

 

11:生命周期每个粒子的旋转速度:每秒粒子旋转的角度。

12:根据速度变化改变粒子的旋转速度:旋转速度不为固定常数时。

13:外部作用力倍增数:调整风对粒子的影响情况。

14:碰撞模块:为粒子创建粒子碰撞效果,目前只支持平面碰撞。

平面碰撞只支持6个平面,点击+号可以添加现在有的平面或是新建立一个。

通过新建立了碰撞平面,会成为粒子物体的子物体。

  Visualization:碰撞平面的显示方式。

——————Grid:  

——————Solid: 

Scale Plane:碰撞平面的大小。

Dampen:阻尼系数。粒子速度撞击损耗程度。0~1。

Bounce:反弹系数。0~2.系数越大,反弹角度越小。

Min kill Speed:最小销毁速度。当速度小于这个值的时候,粒子消失。

Particle Radius:粒子碰撞半径。最小值为0.01。

世界碰撞:

Collides With:碰撞层级。选择与那一层级碰撞。

Collision Quality:碰撞质量。

——————High: 每个粒子会每帧与场景做一次射线碰撞检测,需要注意的是,这样会增加CPU的负担,故在此情况下整个场景中的粒子数应当小于1000。

——————Medium: 粒子系统在每帧会受到一次Parude Raycast Budget全局设定的影晌。

——————Low: 与 中等效果相似 ,只 是粒子系统每4帧才受一次Parude Raycast Budget全局参数的影晌。

 —————— Voxel Size:碰撞缓存中的体素的尺寸,仅当Collision Quality为Medium和Low时可用。

15:子粒子发射模块:在粒子出生,碰撞,消灭时可以调用其他粒子。

   

  

  16:序列帧动画纹理模块:

Tiles:x水平分割的份数,y垂直分割的份数。

Animation:Whole Sheet-整个页面即X,Y一起移动。

Frame over Time:生命周期内,动画变幻的速率。

Cycles:生命周期内变化几次动画。

Animation:Single Row-从左到右行滚动。

Random Row:随机行。

Row:选择某一行,开始滚动,小于Tiles中的Y。

17:粒子的渲染模块:

Render Mode:渲染模式。

——————Billboard:面板渲染。

——————Vertical Billboard垂直渲染,此模式当面对摄像机时,粒子将与zX平面对齐

——————Horizontal Billboard :水平模式,此模式下粒子将沿Y轴对齐。

——————Stretched Billboard:拉伸渲染。

————C ameraScale:相机缩放。摄像机的速度对于粒子伸缩影晌的程度。speed Scale:通过比较粒子的速度决定粒子的长度。 LengthScale:通过比较粒子的宽度决定粒子的长度。

——————Mesh:模式。

18:属性:

Resimulate:实时渲染。在改变参数的时候,场景中的粒子效果实时变化。

Wireframe:选择时,将显示粒子的片面网格。

Trail Renderer

Line Renderer

Lens Flare

Halo

Projector

Legacy Particles

2013-08-16 23:57:49 wwwang89123 阅读数 1428
       Unity3D(U3D)是个游戏3D游戏引擎,也是近来很热门的引擎,操作简单上手很快,我对这个是很感兴趣。
       本菜鸟刚开始学U3D,入门是比难的,首先要了解U3D最重要的五大界面,第一:场景(Sence),构建游戏的地方;第二:层级(Hierarchy),场景中的游戏对象都列在这里。第三:检测面板(Inspector),当前选中的资源或对象的设置,是一些变量和组件的集合。第四:游戏(Game),演示窗口,仅在播放模式中演示。第五:项目 (Project),一些资源的列表,和库的概念一样。
       然后了解主菜单栏的八大菜单:文件(File),编辑(Edit),资源(Assets),游戏对象(GameObject),组件(Component),地形(Terrain),窗口(Window),帮助(Help),熟悉这些菜单每一个命令对以后的游戏制作大有帮助。
在U3D中,一定要对坐标(Coordinates)有个了解,U3D的坐标点是以(x,y,z)的顺序排列的,切记。熟悉坐标,在做游戏的过程中会更加顺手。
如果你没有任何编程基础,一样可以学习Javascript(或C#这些都行),我学AS的时候也完全不懂编程。先学Javascript语言也无妨,因为这个引擎主要是个编程工具。打开Script帮助文档和Monodevelop编写器,从最简单的位移(transform.Translate)开始吧。
      以后我会把自己学到的心得总结发在这里给大家看看的。





Unity3D 中旋转和变换

阅读数 10024

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