Unity

十六 Unity开发环境

六大面板

  • 场景面板(Scene): 提供三维场景内容的导航,允许你选择、移动、旋转或缩放场景中的对象
  • 游戏面板(Game): 可以在游戏面板中查看游戏运行时的实际画面
  • 层级面板(Hierarchy): 展示当前场景中包含的每个游戏对象
  • 项目面板(Project): 展示项目中所有的资源(Assets),每一项资源都是构成项目的一个任何类型的文件
  • 检视面板(Inspector): 当在项目面板选中一项资源时,或在场景面板或层级面板选中一个游戏对象时,可以在检视面板中查看或编辑它的信息
  • 控制台面板(Console): 查看Unity软件给出的关于错误或代码Bug的信息

十九.变量和组件

Unity中的重要变量

三维向量(Vector3):三个浮点数的集合,存储对象的三维空间位置

eg:三维向量的实例变量和函数

  Vector3 position = new Vector3(0.0f, 3.0f, 4.0f); //设置 x, y, z 的值
  print(position.x);
  print(position.y);
  print(position.z);
  print(position.magnitude); // 5.0 三维向量到坐标原点0,0,0的距离长度
  position.Normalize(); // 设置position变量的 Magnitude属性为1 position的x,y,z变成(0.0, 0.6, 0.8)

eg:三维向量的静态变量和函数

  print(Vector3.zero); // (0,0,0) 是 new Vector3(0,0,0)的简写
  print(Vector3.one); // (1,1,1) 是 new Vector3(1,1,1)
  print(Vector3.right); // (1,0,0) 是new Vector3(1,0,0)的简写
  print(Vector3.up); // (0,1,0) 是new Vector3(0,1,0)的简写
  print(Vector3.forward); // (0,0,1) 是new Vector3(0,0,1) 的简写
  Vector3.Cross(v3a, v3b); // 计算两个Vector3的向量积
  Vector3.Dot(v3a, v3b); // 计算两个Vector3的标量积

颜色(Color):带有透明度信息的颜色

  • 由红、绿、蓝三种颜色加透明度(Alpha)组成,电脑屏幕的颜色通过加色法叠加而成
  • 成分存储为一个0.0f到1.0f之间的浮点数,其中0.0f表示该颜色通道亮度为0,而1.0f表示该颜色通道亮度为最高
  • 定义颜色有两种方式,一种是三个参数(红,绿,蓝),另一种是(红,绿,蓝,Alpha)

eg:颜色的实例变量和函数

print(Color.yellow.r); // 1 颜色的红色通道值
print(Color.yellow.g); // 0.92f 颜色的绿色通道值
print(Color.yellow.b); // 0.016f 颜色的蓝色通道值
print(Color.yellow.a); // 1 颜色的alpha通道值

eg:颜色的静态变量和函数

// 三原色
Color.red = new Color(1,0,0,1); // 纯红色
Color.green = new Color(0,1,0,1); // 纯绿色
Color.bloe = new Color(0,0,1,1); //纯蓝色
// 合成色
Color.cyan = new Color(0,1,1,1); //青色 亮蓝绿色
Color.magnta = new Color(1,0,1,1); // 品红 粉紫色
Color.yellow = new Color(1, 0.92f, 0.016f, 1) // 黄色 Unity定义的
Color.black = new COlor(0,0,0,1); // 黑色
Color.white = new Color(1,1,1,1); // 白色
Color.grey = new Color(0.5f, 0.5f, 0.5f, 1); // 灰色
Color.clear = new COlor(0,0,0,0); // 完全透明

四元数(Quaternion):旋转信息。通常会通过GameObject.transform.rotation设置和调整对象的旋转。四元数定义旋转的方式可以避免发生万向节死锁

eg:定义一个四元数

  Quaternion lookUp45Deg = Quaternion.Euler(-45f, 0f, 0f);
  // 传入Quaternion.Euler()函数的三个浮点数是沿x、y和z轴旋转的角度

eg:四元数的实例变量和函数

print(lookUp45Deg.eulerAngles); // (-45,0,0) 欧拉角

数学运算(Mathf):一个数学函数库

  • Mathf附带的所有变量和函数都是静态的,不能创建Mathf的实例

eg:Mathf的(部分)静态变量和函数

Mathf.Sin(x); // 计算x的正弦值
Mathf.Cos(x); // 计算x的余弦值
Mathf.Atan2(y, x); // 计算沿z轴旋转的角度,使原来朝向x轴正方向的对象转而朝向点(x, y)
print(Mathf.PI); // 3.141593 圆周率
Mathf.Min(2, 3, 1); // 1 取三个数中的最小值
Mathf.Max(2, 3, 1); // 3 取三个数中的最大值
Mathf.Round(1.75f); // 2 四舍五入到最接近的整数
Mathf.Ceil(1.75f); // 2 向上舍入到最接近的整数
Mathf.Floor(1.75f); // 1 向下舍入到最接近的整数
Mathf.Abs(-25); // 25 -25的绝对值

屏幕(Screen):关于屏幕显示的信息,提供关于Unity游戏所使用的特定计算机屏幕的信息,与设备无关

eg:屏幕的静态变量和函数

print(Screen.width); // 以像素为单位输出屏幕的宽度
print(Screen.height); // 以像素为单位输出屏幕的高度
Screen.showCursor = false; // 隐藏光标

系统信息(SystemInfo):关于设备的信息,包括操作系统、处理器、显示硬件等设备信息

eg:系统信息的静态变量和函数

print(SystemInfo.operatingSystem); // 输出操作系统名称

游戏对象(GameObject):场景中任意对象的类型,GameObject是Unity场景中所有实体的基类,在Unity游戏屏幕上看到的所有东西都是游戏对象类的子类,GameObject可以包含任意数量的不同组件

eg:

GameObject gObj = new GameObject("MyGO"); // 创建一个名为MyGO的游戏对象
print(gObj.name); // 输出MyGO 游戏对象gObj的名称
Transform trans = gObj.GetComponent<Transform>(); // 定义变量trans为gObj的变换组件
Transform trans2 = gObj.transform; // 访问同一个变换组件的另一快捷方式
gObj.SetActive(false); // 让gObj失去焦点,变为不可见,使其不可运行代码

注意:gObj.GetComponent<Transform>()可以用来访问游戏对象所绑定的组件,可用于多种不同的数据类型

eg:

Renderer rend = gObj.GetComponent<Renderer>(); // 获取渲染器组件
Colloder coll = gObj.GetComponent<Colloder>(); // 获取碰撞器组件
HelloWorld hwInstance = gObj.GetComponent<HelloWorld>(); // 如果gObj上绑定了一个HelloWorld的实例,可以通过这个方法返回这个实例

Unity游戏对象和组件

Unity中所有显示在屏幕上的元素都是游戏对象,并且所有游戏对象都由组件构成

Transform 变换组件:是所有游戏中必然存在的组件,控制着游戏对象的定位、旋转和缩放,它还负责层级面板中的父/子关系,若一个对象是另一个对象的子对象,它就像附着在父对象一样,随父对象同步移动

MeshFilter 网格过滤器:将项目面板中的MeshFilter绑定到游戏对象上。要使模型显示在屏幕上,游戏对象必须有一个网格过滤器(用于处理实际的三位网格数据)和一个网格渲染器(用于将网格与着色器或材质相关联,在屏幕上显示图形)。网格过滤器为游戏对象创建一个皮肤或表面,网格渲染器决定该表面的形状、颜色和纹理

Renderer 渲染器:允许你从屏幕上查看到场景和游戏面板中的游戏对象。网格渲染器要求网格过滤器提供三维网格数据,将网格过滤器、材质和光照组合在一起,将游戏对象呈现在屏幕上 l Colllder 碰撞器:使游戏对象在游戏世界中产生物理存在,可与其他对象发生碰撞。Unity中有四种类型的碰撞器组件:

  • 球状碰撞器:运算速度最快的形状,为球体
  • 胶囊碰撞器:两端为球体,中间为圆柱体,运算速度次之
  • 盒状碰撞器:一种长方体,适用于箱子、汽车、人体躯干等
  • 网格碰撞器:由三维网格构成的碰撞器,比较实用和精确,但运算速度最慢,并且只有凸多面体属性设置为true的网格碰撞器才可以与其他网格碰撞器发生碰撞

Rigidbody 刚体组件:控制着游戏对象的物理模拟(要使碰撞器随游戏对象移动,游戏对象必须有刚体组件)

Script 脚本组件:所有的C#脚本都是游戏对象的组件

二十三.函数与参数

Unity不允许直接修改变换组件的position.x值

    void AlignX(GameObject go0, GameObject go1, GameObject go2)
    {
        float avgX = go0.transform.position.x;
        avgX += go1.transform.position.x;
        avgX += go2.transform.position.x;
        avgX = avgX / 3.0f;
        setAvg(go0, avgX);
        setAvg(go1, avgX);
        setAvg(go2, avgX);
    }

    void setAvg(GameObject go, float avg)
    {
        Vector3 vt = go.transform.position;
        vt.x = avg;
        go.transform.position = vt;
    }

可选参数

    void Awake()
    {
      SetX(this.gameObject, 25); // 因为浮点数可以存储任何整数值,所以把整数值传给浮点型变量不会有问题
      SetX(this.gameObject); // transform.position.x = 0
    }
    void SetX(GameObject go, float eX = 0.0f) // eX变量设置了默认值,编译器会自动把它当作可选参数
    {
        Vector3 vt = go.transform.position;
        vt.x = eX;
        go.transform.position = vt;
    }

params 关键字

使用params关键字可以让函数接收任意数量的同类型参数,这些参数会被转化成该类型的数组

    int Add(params int[] ints)
    {
        int sum = 0;
        foreach(int i in ints)
        {
            sum += i;
        }
        return sum;
    }

递归函数

    int Fac(int n)
    {
        if(n < 0)
        {
            return (0);
        }
        if (n == 0)
        {
            return (1);
        }
        int result = n * Fac(n - 1);
        return result;
    }
    void Awake()
    {
      Fac(5);
    }

二十四.代码调试

编译时错误:是Unity在对C#代码进行编译(编译是指对C#代码进行解析并将其转换为通用中间语言,然后将通用中间语言转换为计算机上运行的机器语言)时发现的错误

Last Updated: 3/29/2020, 5:30:47 PM