Unity开发:预制体、接口与枚举
一、预制体prefab与变体
在游戏场景中需要创建一些gameobject,然而如果要创建多个相同的gameobject的话,就得1个1个单独修改,在Unity中有一个很好的类---prefab预制体
1,预制体prefab(类)
在hierarchy里可以创建一些gameobject,可以拖动project里,然后project里就生成了一个prefab,hierarchy里的这个就成了蓝色的 表示是prefab相关的
2.变体prefab variant(子类)
除了创建多个独立的prefab, 还可以创建 prefab variant,变体prefab variant关联到了预制体prefab,同时变体可以独立修改,如下图:_BaseCounter是预制体,以下全是他的变体,每个都可以单独设置属性等等
预制体变体的特点
- 继承性:预制体变体继承其基预制体的所有特性和属性,除非这些属性在变体中被显式地覆盖。
- 定制化:可以对预制体变体进行定制,而不影响其基预制体及其其他变体。
- 层级修改:对基预制体的修改会传播到所有基于它的变体,但变体中覆盖的属性除外。
二、接口
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构
声明接口
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public interface IKitchenObjectParent
{public Transform GetKitchenObjectFollowTransform();public void SetKitchenObject(KitchenObjectoo kitchenObjectoo);public KitchenObjectoo GetKitchenObjectoo();public void ClearKitchenObject();public bool HasKitchenObject();
}
接口实现
using System;
using UnityEngine;public class Player : MonoBehaviour,IKitchenObjectParent
{public Transform GetKitchenObjectFollowTransform(){return kitchenObjectHoldPoint;}public void SetKitchenObject(KitchenObjectoo kitchenObjectoo){this.kitchenObjectoo = kitchenObjectoo;}public KitchenObjectoo GetKitchenObjectoo() { return kitchenObjectoo; }public void ClearKitchenObject(){kitchenObjectoo = null;}public bool HasKitchenObject() { return kitchenObjectoo != null; }
}
三、枚举
1.枚举的作用
枚举enum是一种值类型,它定义了一组命名的常量
private enum Mode
{LookAt,LookAtInverted,CameraForward,CameraForwardInverted
}
LookAt,LookAtInverted,CameraForward,CameraForwardInverted是枚举成员,每个成员都有一个默认值(从0开始递增)
作用:让代码更具可读性
2.如何划分区间
枚举本身不会自动划分区间,区间的划分是通过代码逻辑实现的。具体来说,是通过 if-else
或 switch
语句来判断值的范围,并返回对应的枚举值。
以下是一个画布面向相机的例子
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LookAtCamera : MonoBehaviour
{private enum Mode{LookAt,LookAtInverted,CameraForward,CameraForwardInverted}[SerializeField] private Mode mode;private void LateUpdate(){switch (mode){case Mode.LookAt:transform.LookAt(Camera.main.transform);break;case Mode.LookAtInverted:Vector3 dirFormCamera = transform.position - Camera.main.transform.position;transform.LookAt(transform.position + dirFormCamera);break;case Mode.CameraForward:transform.forward = Camera.main.transform.forward;break;case Mode.CameraForwardInverted:transform.forward = -Camera.main.transform.forward;break;}}
}
枚举的好处
可读性: 枚举通过有意义的名称来表示常量,使得代码更易于理解
类型安全:枚举是强类型的,避免了直接使用字符串或数字带来的潜在错误
易于扩展:如果需要增加新的范围,只需在枚举中添加新的成员,并在switch语句中处理即可