2019-11-12 20:26:51 tj_010914 阅读数 48
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4724 人正在学习 去看看 张刚

关于unity3d地面检测 1:

可以用自身发出射线并检测是否触碰到地面来判断是否在地面:

void groundcheck()
{
	if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), 3.50f, background))//Physics.Raycast(射线发出位置,射线方向,射线长度,射线碰撞检测Layer)
        {
            canjump = true;
        }
        else
            canjump = false;
}
void jumping()
{
	if (Input.GetKeyDown(KeyCode.Space))
        {
            if (canjump==true) 
            {
                Debug.Log("asdasd");
                rb.AddForce(Jump, ForceMode.Impulse);
            }
        }
}

当然 简单但缺点不少,比如:

  1. 当在空中尚未超出射线长度时仍可以跳跃。
  2. 如果射线过短即使下坡时也会无法跳跃。
  3. 当地面有一些小缝隙时也会造成无法跳跃的结果等等。
2019-11-15 22:29:16 tj_010914 阅读数 46
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4724 人正在学习 去看看 张刚

关于Unity3d地面检测2:
用射线还有一些缺点 , 比如站在两块地面直接时不可跳跃 所以可以使用碰撞器来进行地面检测:
例如 对地面的Tag设置为background并添加两个collider一个设置为Trigge!
在这里插入图片描述
对player添加脚本

public calss jump :MonoBehavior
{
	Vector3 Jump = new Vector3(0.0f, 20f, 0.0f);
    bool canjump;
    Rigidbody rb;
    void Start()
    {
    	canjump = true;
        rb = GetComponent<Rigidbody>();
    }
     void Update()
    {
        jumping();
    }
     private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("background")) ;
        canjump = true;
    }
    void jumping()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(canjump)
            {
                rb.AddForce(Jump, ForceMode.Impulse);
            }
            canjump = false;
        }
    }
}

如果player触碰到地面则可以跳跃 并将bool 改为false

2013-07-20 14:59:28 a2587539515 阅读数 3221
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4724 人正在学习 去看看 张刚

账号被盗,文章被修改,博主已将博文删除

2018-08-11 10:20:07 jxw167 阅读数 2301
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4724 人正在学习 去看看 张刚

现实生活中,地面上经常会有云彩的影子在移动,它其实就是通过太阳光将其投射到地面上的,这个应用在游戏中跟人的感觉场景比较真实,在FoxHole散兵坑游戏中就实现了这个效果,如下图所示:
这里写图片描述

实现类似的效果方法有两种:一种是常用的方法,就是使用一个天空盒,再实现一个飘动的云层,然后通过平行光将其投射到地面上,虽然比较好理解,这种方法不推荐,运行效率也会受影响。另一种方法就是我们本篇博客需要实现的,通过改变纹理的UV,实现移动效果。下面具体介绍如何实现
首先我们要整一个平面将阴影渲染到上面去,这里不是指RenderTexture,这个平面设置的时候需要一点小技巧就是它的位置和大小跟摄像机的远裁剪面是一样的,效果如下所示:
这里写图片描述
上图是我们需要将云层绘制的平面区域,下面是摄像机的远裁剪面,如下所示:
这里写图片描述
下面是通过代码实现二者的一致性,先实现四边形与摄像机远裁剪面位置一致:

        Camera cam = Camera.main;
        float dist = cam.farClipPlane - 0.1f; // 0.1 is some magic value to avoid culling
        Vector3 campos = cam.transform.position;
        Vector3 camray = cam.transform.forward * dist;
        Vector3 quadpos = campos + camray;
        transform.position = quadpos;

还有四边形平面与摄像机远裁减面的大小要一致:

Vector3 scale = transform.parent ? transform.parent.localScale : Vector3.one;
        float h = cam.orthographic ? cam.orthographicSize * 2f : Mathf.Tan(cam.fieldOfView * Mathf.Deg2Rad * 0.5f) * dist * 2f;
        transform.localScale = new Vector3(h * cam.aspect / scale.x, h / scale.y, 0f);

上面基本的操作已经完成,接下来就要考虑我们的代码放在哪个函数里面?Update,FixedUpdate还是自定义函数?
在回答这个问题之前,先给读者看一下Unity官方提供的函数执行顺序图:
这里写图片描述
这里写图片描述
这个图的执行顺序大家一定要牢记,关键时候可以派上用场,我们可以看到在Scene rendering中有个函数OnWillRenderObject,官方给出的功能解释是:如果对象可见,则为每个相机调用一次此函数,我们的渲染选择的就是该函数,我们还看到一个函数是OnRenderImage,可能感觉它比较合适,官方给出的解释是:OnRenderImage(仅限专业版): 在完成场景渲染后调用此函数,以便对屏幕图像进行后处理,所以不适合我们需要的。
继续我们的云层渲染讲解,第一步的工作已经完成,下面是考虑实现投影到地面上的云层有哪些需要考虑的点:
这里写图片描述
其中最终要的是深度纹理图的实现,在Unity引擎中的前向渲染路径(Forward Rendering)下,我们需要手动设置相机,让它提供场景的深度信息,代码如下所示:

Camera.main.depthTextureMode |= DepthTextureMode.Depth;

如果在延迟渲染路径(Deferred Lighting)下,由于延迟渲染需要场景的深度信息和法线信息来做光照计算,所以并不需要我们手动设置相机。
这样我们就可以在shader中访问_CameraDepthTexture来获取保存的场景的深度信息,之后再利用UNITY_SAMPLE_DEPTH这个宏来处理_CameraDepthTexture的值,这样我们就获取了某个像素的深度值。
此时的深度值并非是线性的,因此我们常常需要利用另一个内建的方法Linear01Depth将结果转化为线性的。这样,我们就能将场景的深度信息渲染为一张灰度图,Shader代码如下所示:

float  depth = Linear01Depth( SAMPLE_DEPTH_TEXTURE( _CameraDepthTexture, i.uv ) );

我们就能将场景的深度信息渲染为一张灰度图。如下所示:
这里写图片描述
我们利用深度图可以做很多事情,渲染后处理效果比如景深,SSAO,Blur,Bloom等等都与深度图技术相关,其实很多游戏使用该功能渲染场景,在此只是跟读者再回顾一下,比如下面的游戏画面:
这里写图片描述
我们实现的地面动态实时阴影也使用了该技术,接下来我们再介绍云层移动,云层移动是与uv相关的,我们先要获取到uv,Shader代码如下所示:

    o.pos = UnityObjectToClipPos (v.vertex);
    o.uv = v.texcoord.xy;

接下来计算在世界空间中从相机到远裁剪的平面四边形的射线,Shader代码如下所示:

float3 pos_world = mul (unity_ObjectToWorld, v.vertex);
o.ray = pos_world - _WorldSpaceCameraPos;

以上代码都是在顶点着色器中计算得到的,下面在片段着色器中实现云层的uv变化,Shader代码如下所示:

                float  depth = Linear01Depth( SAMPLE_DEPTH_TEXTURE( _CameraDepthTexture, i.uv ) );
                float3 world = i.ray * depth + _WorldSpaceCameraPos;
                // Convert world position to cloud uv
                #if SSCS_TOPDOWN
                float2 world_uv = world.xz;
                #else
                float2 world_uv = world.xy;
                #endif
                float2 cloud_uv = world_uv * 0.005f; 
                float2 cloud_wind = _CloudFactor.xy;
                float2 cloud_tiling = _CloudFactor.zw;
                cloud_uv = (cloud_uv + cloud_wind) * cloud_tiling;

最后云层还需要有淡入淡出效果,Shader代码如下所示:

float  cloud = tex2D(_MainTex, cloud_uv).r;     
float  cloud_faded = cloud * (1.0 - depth); 

阴影渲染是在相机空间中实现的,我们需要将一些值传给我们的Shader,下面的逻辑代码完成了传值操作:

transform.rotation = Quaternion.LookRotation(quadpos - campos, cam.transform.up); // align uv with _depthtexture

            float t = Time.time;
            _ren.sharedMaterial.SetVector("_CloudFactor", new Vector4(
                cloudWindSpeed.x * t
                , cloudWindSpeed.y * t
                , cloudTiling.x
                , cloudTiling.y));

            if(cam.orthographic)
            {
                _ren.sharedMaterial.EnableKeyword("SSCS_ORTHO");
                _ren.sharedMaterial.SetVector("_WorldSpaceCameraRay", camray);
            }
            else
            {
                _ren.sharedMaterial.DisableKeyword("SSCS_ORTHO");
            }

另外,云层的颜色,形状都可以改变的,实现逻辑代码如下所示:

_ren.sharedMaterial.SetTexture ("_MainTex", cloudTexture);

            // Pre calculate color multiplier at script (not shader)
            // 1 minus for darken blending
            _ren.sharedMaterial.SetVector("_ShadowFactor", new Vector4(
                (1f - shadowColor.r) * shadowIntensity
                ,(1f - shadowColor.g) * shadowIntensity
                ,(1f - shadowColor.b) * shadowIntensity
                ,1f));

            // If cloud is topdown way, world position.xz converted to cloud uv
            if(isTopDown)
            {
                _ren.sharedMaterial.EnableKeyword("SSCS_TOPDOWN");  
            }
            else
            {
                _ren.sharedMaterial.DisableKeyword("SSCS_TOPDOWN"); 
            }

下面我们把脚本和Shader挂到我们的四边形平面的实例化对象上面,如下所示:
这里写图片描述

对 CloudShadow.cs脚本中的参数我们可以设置,改变云层的形状,颜色,移动速度等等,实现效果如下所示:
这里写图片描述
另外我们可通过改变纹理对应云层形状改变,如下图所示:
这里写图片描述

这里写图片描述

代码下载地址:链接:https://pan.baidu.com/s/1DYwieVaBgrUANeoopPueJQ 密码:a6hy

2018-01-14 22:09:51 weixin_41556165 阅读数 1367
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4724 人正在学习 去看看 张刚
如果有不懂得先看http://blog.csdn.net/weixin_41556165/article/details/79013817谢谢
一般使用ISO更加方便,大佬都这么用不要问我为什么
创建材质,紫色材质的地面。新建文件夹取名Materials,右键create->material并命名为Ground
创建一个场景,本案例只有一个场景命名为main
创建地面(放大两倍)和小球,并将Ground材质(右键创建)给地面。通过拖动材质到Scenes上或拖动至层级视图的Ground上
如下所示:
将小球设置为刚体
刚体的概念:在任何力的作用下,体积和形状都不发生改变的物体叫做“刚体”(Rigid body)。它是力学中的一个科学抽象概念,即理想模型。
点击添加组件,搜索rigi并添加。小球具有了物理属性
给小球添加脚本:project下右键创建文件夹在文件夹上右键创建C# script脚本。
拖动脚本至Player的Add Component上,即应用该脚本。

编辑脚本:双击脚本进行编辑。
开启动画(点击上面的播放图标),发现小球沿着x轴滚动起来了
小球受方向键控制
input.GetAxis 用法(GetAxis("Mouse X"),GetAxis("Mouse Y"),GetAxis("Mouse ScrollWheel"),GetAxis("Vertical "),GetAxis("Horizontal "),
GetAxis 是个方法,需要传参数,参数为string类型,参数如下:
一:触屏类
1.Mouse X 鼠标沿着屏幕X移动时触发
2.Mouse Y 鼠标沿着屏幕Y移动时触发
3.Mouse ScrollWheel 当鼠标滚动轮滚动时触发
二:键盘操作类
1.Vertical 对应键盘上面的上下箭头,当按下上或下箭头时触发
2.Horizontal 对应键盘上面的左右箭头,当按下左或右箭头时触发

定义变量用于改变力的大小,public变量可在unity中脚本所在位置修改
控制相机跟随
在相机脚本中定义一个playerTransform组件,指定组件功能所控制的物体。
相机脚本如下,三维向量offset用于接收两者的相对位置向量


知识点:Transform
变换组件决定了场景中所有物体的方位,旋转和缩放。每个物体都有一个变换组件。
变换组件的所有属性都是相对其父物体进行衡量的,如果此物体没有父物体,这些属性则相对于世界坐标进行计算。
Properties 属性
  • Position 位置
以X、Y、Z坐标系表示变换的位置。
  • Rotation 旋转
表示此变换以X,Y,Z轴为准的旋转程度,以角度为单位。
  • Scale 缩放
沿着X,Y,Z轴缩放此变换。值为"1"时表示原始尺寸(物体最初被导入时的大小)

控制小球的移动范围
创建cube改变样式将地面围起来就控制了范围。
创建碰撞消失的物体
创建一个cube并改名为PickUp,设置其倾斜x,y,z均为45度,要创建一样的很多个实物方法如下:
1.再project窗口中创建一个模型文件夹Prefabs用于存放模型,将该PickUp拖入该文件夹,由于要创建多个在层级视图中创建PickUps存放所有的PickUp。
注意:其他PickUp由模型PickUp(Prefabs文件夹里的)拖至面板生成,或者ctrl+D生成。
控制碰撞消失物体的旋转
创建脚本用于旋转,使用transform组件,将脚本用于模型PickUp(Prefabs文件夹里的这样所有由模型创建的物体均沿着y轴旋转起来了。
小球碰撞的物体消失
给所有物体添加PickUp标签,小球碰撞到的带标签的物体该物体就消失。碰撞函数为OnCollisionEnter,传入碰撞体参数,该脚本为Player的脚本所以碰撞体为小球。



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