跟诸子学游戏 Unity3d小技巧(杂项)

1:C#  https://www.nuget.org/ 第三方库 上面查找常用的类库,如json解析库litjson /Newtonsoft.Json   单元测试框架NUint   对象关系映射器Entity Framework(数据库方面相关)  Log4net日志信息相关.

2:unity3d编辑器:所有的图像在wireframe情况下,都是三角形展示,正方体8个顶点12个三角形,圆形有很多个三角形组成,游戏里面看到的都是由点和三角形组成.前面是自建3D物体使用到的原理,例子:使用meshfilter绘制自身的网格获取meshfilter网格属性mesh,组织多面体顶点,将mesh的vertices顶点属性赋值,然后将这些值,按照三角形triangles的规则进行绘制.

3:有限状态机  https://www.jianshu.com/p/8ff1da8f741c

4:解惑:1:如何让一个button的方法在unity编辑器里面动态显示绑定到上一个场景的物体脚本上面的方法,答案是无解,必须要使用脚本动态绑定.2:unity从分线程调用到主线程使用loom(百度搜下,别人已经封装好)脚本,unity没有多线程概念,C#有这个概念,unity使用的C#的多线程概念,可以在游戏里面使用多线程.3:场景一旦转换过后,上一个场景就会被销毁,连带脚本,脚本上面的引用,都会有GC垃圾回收器管理.

5:unity3d中Layer用32位表示0000 0000 0000 0000 0000 0000 0000 0000 

第九层就表示成

0000 0000 0000 0000 0000 0010 0000 0000

1<<9 表示向左移动9位

6:在一个字段上面写特性[Range(0,6)] 则会出现如下

效果

7:让一物体跟随鼠标的箭头移动而转向,例如:主角的朝向,坦克的炮管朝向等,然后只需要让角色超前(transform.forward)走即可

第一种方法:

        在update方法中

        Plane playerPlane = new Plane(Vector3.up, transform.position);

        Ray RayCast = Camera.main.ScreenPointToRay(Input.mousePosition);

        float HitDist = 0;

        if (playerPlane.Raycast(RayCast, out HitDist))

        {

            Vector3 RayHitPoint = RayCast.GetPoint(HitDist);

            Quaternion targetRotation = Quaternion.LookRotation(RayHitPoint - transform.position);

            Turret.transform.rotation = Quaternion.Slerp(Turret.transform.rotation, targetRotation, Time.deltaTime * turretRotSpeed);

        }

第二种方法:

            Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit hitInfo;

            bool isCollider = Physics.Raycast(ray, out hitInfo);

            if (isCollider && hitInfo.collider.tag == Tags.ground) {

                    targetPosition = new Vector3(hitInfo.point.x, transform.position.y, hitInfo.point.z);

                    this.transform.LookAt(targetPosition);

              }

第一种方法比第二种要好.

8:让摄像机跟随主角移动:创建一个脚本,挂载到摄像机上面.


跟诸子学游戏 Unity3d小技巧(杂项)_第1张图片
照抄即可

/// /// 主角对象

    /// public Transform cubeT;    ///    /// 摄像机相对于主角的位置,唯一,获取一次即可

    /// private Vector3 relativePos;    void Start()    {        relativePos = this.transform.position;    }    void Update()    {        ///主角的移动后的位置,加上相对位置,表示摄像机最终需要到达的位置        Vector3 newV3 = cubeT.transform.position + relativePos;        transform.position = Vector3.Lerp(transform.position, newV3, 2.0f * Time.deltaTime);        ///相对平稳滑动到照射主角的角度.        Quaternion cubeQ = Quaternion.LookRotation(cubeT.transform.position - transform.position);        transform.rotation = Quaternion.Slerp(transform.rotation, cubeQ, 2.0f * Time.deltaTime);    }

9:C#中使用protobuf进行数据传输 https://github.com/mgravell/protobuf-net  从上面下载项目然后进行学习,在项目里面加入protobuf是通过VS NuGet包管理器加入,https://www.nuget.org/packages/protobuf-net NuGet包地址下载完毕之后会有protobuf-net.dll 这个文件,将其放入unity3d中,既可以使用.

10:当你设置gamemanager为DontDestroyOnLoad时,从当前场景进入下一个场景,再返回回来会产生2次加载,解决方法是游戏开始时加载一个整个游戏期间只加载一次的场景,永远不退回次场景.

跟诸子学游戏 Unity3d小技巧(杂项)_第2张图片
gamemanager被多次加载

11:当在lambda表达式中使用任何局部变量时,C#会生成一个类,并将该变量作为该类的一个属性,但是我们无须定义该类,C#编译器会自动帮我们实现;

12:使用刚体组件时需要注意:1.parenting:父子级:当一个游戏对象受物理系统控制时 ,它会以半独立的方式随着父对象的位移而移动 ,如果任何父对象有所运动的话 ,这些父对象会推着子对象的刚体跟随它们一起运动。不过这些刚体由于受重力影晌的原因还是会下落而且对于碰撞事件也是会有所晌应的。2. scripting:  脚本:可通过在游戏对象的刚体上添加AddForce()和AddToque()函 数 ,达到通过脚本来添加作用力或扭矩力 ,来对刚体进行控制 。要注意的是 ,在使用物理系统时,不直接改变对象的Transform组件的属性 ;3.Animation:动 画:有些情况下 ,如需要创建布娃娃效果的时候 ,需要在动画和物理系统间切换对象的控制权 。因此当刚体被标记为动力学模式时 ,就不会受到如碰撞、作用力或其他物理效果的影晌 ,这就意昧着需要直接操作该对象的Transform组件属性来控制该对象了。动力学刚体会影晌其他的对象 ,但其自身并不受到物理系统的影响。例如 ,那些绑定到动力学对象上的关节会约束其他绑定到该对象上的刚体 ,动力学刚体在碰撞时会影晌其他的刚体 。

13:当一个物体是否在另一个物体的视野范围内,也就是人眼向前看一个扇形,需要判断角度和距离,角度是 扇形角度/2 ,当其他物体与当前物体的夹角大于这个结果,则不再视野范围内,如果小于这个结果,则在这个视野范围内,

if( Vector3.Distance(playerTransform.position,transform.position)<=viewDistance)//距离

{ Vector3 playerDir = playerTransform.position - transform.position;

      float angle = Vector3.Angle(playerDir, transform.forward);

   if (angle <= viewAngle / 2)//夹角是否小于 视野范围扇形角度的一半

{Debug.Log("InSight"); } }

14:




(ps:待后续)

你可能感兴趣的:(跟诸子学游戏 Unity3d小技巧(杂项))