版权声明:

  • 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客"
  • 您可以自由转载,但必须加入完整的版权声明!

首先:

  • alt + 鼠标拖拽 视角旋转

  • 按住鼠标中间,并移动鼠标,可以平移视图

  • 按住鼠标右键,wasdqe 可以在6个方向上移动

  • 在 Hierarchy视图中,鼠标左键先选中一个 物体,按下 shift ,再 鼠标左键选中另外一个 物体,即可选中 多个 物体,进行操作。此时把在右侧Inspector添加组件就可为所有GameObject添加Component

  • unity默认游戏单位为米

  • plane默认长宽是10米 Capsule默认是2个1米的半球加一个1m的圆柱体组成 cube Sphere

  • unity中的Skybox也会提供一些天光(各个方向上微弱的光)

  • Global坐标系永远和场景的坐标系保持一致 (随着世界坐标系选择)

  • local坐标系总是与物体自身方向保持平行

  • persp是透视模式,近大远小

  • Iso是平行投影

  • materials 材质

  • 灯光的颜色与物体的颜色向乘得到最后显示给用户的颜色(颜色分量相乘,物体之所以显示红色是因为其反射红色的光)

  • Time.timeScale //时间流逝的规模。这可以用于慢动作效果

  • 当timeScale为1.0时,时间与实时一样快。当timeScale为0.5时,时间比实时慢2倍。

  • 当timeScale设置为零时,如果所有功能都与帧速率无关,则游戏基本暂停。

  • 除了realtimeSinceStartup,timeScale影响Time类的所有时间和delta时间测量变量。

  • 如果降低timeScale,Time.fixedDeltaTime也会降低相同的量。设置为零时,不会调用- fixedupdate

  • 小球移动:

    private void FixedUpdate()
{
Time.timeScale =0.5f; //子弹时间,加速减速均可用该值实现
if (Input.GetKey(KeyCode.LeftArrow)) //unity事先就检测到了所有按键,所以在这可以直接判断按键是否按下,用if判断就可以同时施加不同方向上的力 //GetKey是检测按键的持续情况,GetKeyUp和GetKeyDown是只有在按键的上、下边缘才会检测,可以做触发器,但不宜实时控制运动
{
rigidbody.AddForce(-moveForce * Time.fixedDeltaTime, 0, 0); //乘以FixedDeltaTime的意义就在于时间可以缩放,加了个权重
}
if (Input.GetKey(KeyCode.RightArrow))
{
rigidbody.AddForce(moveForce * Time.fixedDeltaTime, 0, 0);
}
if (Input.GetKey(KeyCode.UpArrow))
{
rigidbody.AddForce(0, 0, moveForce * Time.fixedDeltaTime);
}
if (Input.GetKey(KeyCode.DownArrow))
{
rigidbody.AddForce(0, 0, -moveForce * Time.fixedDeltaTime);
}
if (Input.GetKey(KeyCode.Space))
{
rigidbody.AddForce(0, jumpForce * Time.fixedDeltaTime, 0);
}
}
  • Physic Material //物理学材料是用来调整摩擦和碰撞对象的反弹效应。 //属于collider一个属性

  • 属性: 功能:

  • 动态摩擦 已经移动时使用的摩擦力。通常是从0到1的值。零值感觉像冰一样,值1将使它非常快地停下来,除非大量的力或重力推动物体。

  • 静摩擦力 物体静止在表面上时使用的摩擦力。通常是0到1之间的值。零值感觉像冰,值1会使对象移动变得非常困难。

  • 反弹力 表面有多么有弹性?值0不会反弹。值1将在没有任何能量损失的情况下反弹,但是可以预期某些近似值,但这可能会为模拟增加少量能量。

  • 摩擦组合 如何组合两个碰撞物体的摩擦力。

    - 平均 两个摩擦值是平均值。

    - 最低 使用这两个值中最小的一个。

    - 最大 使用这两个值中最大的一个。

    - 乘以 摩擦值相互相乘。

  • 弹跳组合 如何组合两个碰撞对象的弹性。它具有与摩擦组合模式相同的模式

  • 摩擦力是防止表面相互滑落的量。尝试堆叠对象时,此值很重要。摩擦有两种形式,动态和静态。物体静止时使用静摩擦力。它会阻止对象开始移动。如果对物体施加足够大的力,它将开始移动。此时动态摩擦将发挥作用。动态摩擦力现在会在与另一个物体接触时尝试减慢物体的速度。

  • 当两个物体接触时,根据所选择的模式对它们两者施加相同的弹性和摩擦效果。当两个接触的碰撞器具有不同的组合模式设置时,存在一种特殊情况。在这种特殊情况下,使用具有最高优先级的功能。优先顺序如下:平均 < 最小 < 乘以 < 最大值。例如,如果一个材质具有平均值但另一个具有最大值,则要使用的组合函数为最大值,因为它具有更高的优先级。 //力的作用是相互的,所以当两个物体的摩擦力系数不同时,有不同的计算摩擦力的方法,但是加在这两个物体上的摩擦力大小相等方向相反

  • 让摄像机跟着小球动,如果作为子节点,会收到小球移动和旋转的影响,我们不希望收到旋转影响,所以我们只需要摄像机跟随小球的位置移动就可: //一个平行四边形的移动

public class MainCamera : MonoBehaviour
{
public Transform player; private Vector3 offset;
private Vector3 playerStartPosition;
private Vector3 cameraStartPosition;
// Start is called before the first frame update
void Start()
{
playerStartPosition = player.position;
cameraStartPosition = this.transform.position; offset = this.transform.position - player.position;
} // Update is called once per frame
void Update()
{
// this.transform.position = cameraStartPosition + (player.position - playerStartPosition); //用Offset和相机起始位置偏移均可,因为是个平行四边形
this.transform.position = player.position + offset;
}
}
  • 为了不影响小球在吃道具时的速度,需要把道具设置为trigger

  • collider性能优化: //collider相当于mesh的网格模型,只不过不是用来画图而是用来计算碰撞的,所有的静态物体生成一个collider静态网格,当有动态物体碰撞到静态物体时,根据该网格计算动态物体该如何进行反应

  • unity中计算场景中所有的静态碰撞器的碰撞体并把他们保持在缓冲中,这使得所有的静态碰撞体不能够移动并节省每帧计算碰撞体的开销 //unity保存到缓存后,不会每帧都再次计算静态碰撞体

  • 我们的错误在于让道具旋转了

  • 任何时候,当我们移动、旋转、缩放一个静态碰撞器时,unity会再次重新计算所有的静态碰撞器,并更新静态碰撞器的缓存,而重新计算缓存是有开销的

  • 我们可以移动、旋转或缩放动态碰撞器并且unity不会重新缓存任何碰撞器的碰撞体 //动态碰撞器实时计算

  • unity鼓励我们移动碰撞体,只要我们在移动之前声明该碰撞器是动态的即可

  • 要做到这点,我们只要使用Rigidbody组件,任何带有Collider和Rigidbody的游戏对象都被认为是动态的,任何不带rigidbody而带有Collider的组件的游戏对象都被认为是静态的,而我们的道具就被认为是静态的,因此unity会每帧重新计算静态碰撞器的缓存

  • 解决方案:

  • 为道具添加Rigidbody,其实变为动态碰撞器,

  • 此时立方体会掉落,因为Rigidbody是有重力的,我们可以设置rigidbody.useGravity = false,这会阻止立方体下落,但是此时立方体虽然不受重力了,但是任然会受其他类型物理力的影响且会带来物理开销

  • 更好的解决方案为设置:Rigidbody.IsKinemaitc = true;

  • 一个Kinematic的刚体不受物理力的影响,而只受图形变换的影响(如动画和Transform组件)

    这一点用在带有触发器或碰撞器的物体上很好,如电梯或平台的自动移动就是用图形动画(而非物理运算)实现的

  • 总结:

    • 静态物体不应具有Rigidbody
    • 动态物体应具有Rigidbody
    • 受物理力影响的Rigidbody应使用默认设置(Kinematic为false)
    • 受图形变换影响的Rigidbody应设置Kinematic为true;

Unity经典游戏编程之:球球大作战的更多相关文章

  1. FC经典游戏还原之:松鼠大作战2

    版权声明:本文原创发布于博客园"优梦创客"的博客空间(id:raymondking123) 原帖地址:http://www.cnblogs.com/raymondking123/p ...

  2. Unity经典游戏教程之:冒险岛

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  3. Unity经典游戏教程之:雪人兄弟

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  4. Unity经典游戏教程之:贪吃蛇

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  5. Unity经典游戏教程之:是男人就下100层

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  6. Unity经典游戏教程之:合金弹头

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  7. Unity经典游戏教程之:弓之骑士

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  8. 游戏编程之Unity常用脚本类的继承关系

    前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...

  9. 闲扯游戏编程之html5篇--山寨版《flappy bird》源码

    新年新气象,最近事情不多,继续闲暇学习记点随笔,欢迎拍砖.之前的〈简单游戏学编程语言python篇〉写的比较幼稚和粗糙,且告一段落.开启新的一篇关于javascript+html5的从零开始的学习.仍 ...

随机推荐

  1. yarn or npm 版本固化如何选择

    前言 作为前端开发者,npm这个包管理工具的重要性显而易见.优点不再表述,但一些缺点是为使用者诟病比较多的:速度慢.版本控制.下面主要讨论下npm的版本固化问题,即lock文件. npm语义化版本管理 ...

  2. c# 图文添加文字斜水印

    项目中有个添加水印的需求,需要给图片铺满斜水印. 网上搜了半天全是添加在图片上.下.左.右的案例. 于是按照网上的某一段案例自己修改了一些代码. Bitmap bitmap = new Bitmap( ...

  3. .Net进程外session配置

    配置步骤: 1.开启 ASP.NET状态服务:cmd状态下:services.msc 2.配置web.config文件,在system.web下加入如下配置 <sessionState mode ...

  4. 数字IC前后端设计中的时序收敛(六)--Max Fanout违反

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...

  5. Spring Boot 邮件发送的 5 种姿势!

    邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方,都会用到,使用 JavaSE 代码发送邮件,步骤还是挺繁琐的,Spring Boot 中对于邮件发送,提供了相关的自动化配置类,使得邮件发送 ...

  6. 【Go】类似csv的数据日志组件设计

    原文链接:https://blog.thinkeridea.com/201907/go/csv_like_data_logs.html 我们业务每天需要记录大量的日志数据,且这些数据十分重要,它们是公 ...

  7. markdown浅谈

    markdown是啥? markdown就是一种修饰网页/博客的方法,他能使网页变得更美观. 我们先解释一下代码框: 这个没法保留,就是把键盘左上角的⋅·⋅ 切换成英文变成`. 然后``` 在隔一行` ...

  8. GeoPackage - 一个简便轻量的本地地理数据库

    GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件.与操作系统无关的地理数据库. 当前标准是1.2.1,该版本的html版说明书:https://www.geopackag ...

  9. [02] HEVD 内核漏洞之栈溢出

    作者:huity出处:http://www.cnblogs.com/huity35/版权:本文版权归作者所有.文章在看雪.博客园.个人博客同时发布.转载:欢迎转载,但未经作者同意,必须保留此段声明:必 ...

  10. MYSQL主从复制、主主复制、双主多从配置

    一.如何配置MYSQL的主从复制? 1. 两台数据库服务器,IP分别为 192.168.216.128 和 192.168.216.129,在服务器上装MYSQL(我的配置版本为5.5.56) 2. ...