以下是关于unity中游戏物体(GameObject)和认识常用组件(Component)的相关学习记录。
1.什么是GameObject和Component?
unity将游戏中的物体称为GameObject,也就是游戏物体。它包括之前学习过的3D Object【Cube(立方体)、Sphere(圆)、Capsule(胶囊体)、Cylinder(圆柱)、Plane(平面)、Quad(竖直小平面)、Empty Object(空物体)等】、Camera、Light、UI等。在一个unity场景中可以包含任意的游戏物体且每个物体都有属于自己的名称、标签等基本信息和组件等(在Inspector面板可以查看)。
组件是用来实现物体某些功能的单元,可以将游戏物体想象成一个空的容器,而组件就是存放在容器中的内容物。每个游戏物体可以挂载任意多个组件,但最少必须带有一个Transform(变换组件),没有Transform组件的游戏物体我们就无法获知它在场景中的位置。
2.物体的标签和层
物体的标签像是物体的另一个名称,但它也有自己的特点。当我们的项目中有多个玩家想通过一个脚本把它们都查找到,这时候我们就可利用标签,给它们添加上同一个标签,再通过Game Object.FindGameObjectWithTag("TagName")方法查找。通过名称查找的方法为GameObject.Find("Name"),这样只能一个个去查找。所以在某些情况下查找标签要比查找名称更快。
物体的层一般用于碰撞操作,如果想让两个物体不发生碰撞就可以给它们分好层。被unity占用的层有Default(默认层)、TransparentFx(透明特效层)、Ignore Raycast(射线忽略层)等,未被unity占用的层我们都可以自行定义和使用(Add layer->Layers内就可以添加自己想要的层)。
3.空物体
空物体就是只挂载一个Transform组件的游戏物体,在Hierarchy面板空白区域单击->Create Empty即可完成创建,在空物体上也可以挂载任意多组件。
4.物体的父子关系
情况一:组合物体。例如有一个正方体和一个圆,移动坐标轴的时候想让他们同时移动。
这时我们可以给他们组成父子关系,在层级(Hierarchy)面板中将Sphere拖拽到Cube上,这时Sphere就成为Cube的“孩子”了。
此时选中Sphere移动坐标轴发现它可以自由移动,而移动Cube时Sphere也跟着一起移动。不管是缩放还是旋转父物体上的操作子物体也会受到影响。
在这里我们可以看到不管怎么移动子物体,再次选中父物体时它们们的坐标轴总会出现在它们中间。怎么让坐标轴回到父物体自己身上,在Scene面板下导航栏内选中如上图标将Center(世界坐标系)改为Pivot(局部坐标系)就可以了。这样我们在操作旋转的时候子物体就会以父物体为中轴旋转了。
情况二:管理大量物体。当场景中创建了大量的物体时,层级面板会显得很乱,这时我们可以利用一个空物体作为它们的父物体来进行管理它们。
实现按下键盘按键开关门:
创建物体:1.门框、门扇(都是由Cube缩放移动搭建而成,添加材质(Assets文件夹内右键->Create->Material->Albedo栏修改颜色))
2.门轴(创建一个空物体->将它移动到左侧门框上贴近门扇->将门扇拖拽到它身上构成父子关系->修改为局部坐标系->测试旋转)
创建脚本:DoorContorller添加代码,按下u键实现开门,按下v键实现关门。将脚本挂载在门轴上,然后运行。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorController : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.U)){
OpenDoor();
}
if (Input.GetKeyDown(KeyCode.V))
{
CloseDoor();
}
}
public void OpenDoor()
{
transform.Rotate(0, 90f, 0);
}
public void CloseDoor()
{
transform.Rotate(0,-90f,0);
}
}
5.常用组件
1.变换组件Transform,控制物体的位置、缩放、旋转等基本属性,每个物体有且仅有一个。
2.网格过滤器Mesh Filter,3D物体外观有网格组成,用于指定物体网格。
3.网格渲染器,控制物体渲染材质、灯光等。
4.胶囊碰撞器,这只是碰撞器的一种。
5.刚体Rigidbody,用于给物体添加物理特性,质量、惯性等。
6.粒子系统Particle System,用于模拟火焰、烟花、烟雾等特效。
7.动画控制器Animator,用于控制物体播放动画。
6.控制玩家移动触发开关门
搭建一个门模型:上面已经搭建了。
添加触发器:在门轴上添加一个Box Collider盒子碰撞器组件,并勾选Is Trigger(触发)。
创建玩家(Player):添加Rigidbody组件、材质。
编辑脚本:PlayerContorller、DoorContorller。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorController : MonoBehaviour
{
//判断门的状态
private bool isOpen = false;
//开门角度
public float openAngle = 90.0f;
//开门方法
public void OpenDoor()
{
//门处于关闭状态可以打开
if (!isOpen)
{
transform.Rotate(0, openAngle, 0);
isOpen = true;
}
}
//关门方法
public void CloseDoor()
{
//门处于打开状态可以关闭
if (isOpen)
{
transform.Rotate(0, -openAngle, 0);
isOpen = false;
}
}
}
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
//定义玩家移动速度
public float speed = 5.0f;
private DoorController doorController;
void Start()
{
//获取控制开关门的脚本组件
doorController =GameObject.FindObjectOfType<DoorController>();
}
void Update()
{
//玩家移动方法
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.Translate(h*speed*Time.deltaTime,0,v*speed*Time.deltaTime);
}
//触发开始方法
private void OnTriggerEnter(Collider other)
{
//触发,调用开门方法
doorController.OpenDoor();
}
//触发结束方法
private void OnTriggerExit(Collider other)
{
//结束,调用关门方法
doorController.CloseDoor();
}
}
以上就是所有关于unity游戏物体和认识常用组件的学习记录了,如有错误还请大家指正。