U3D 面向组件开发

应用程序
新创建的Unity工程,其目录文件夹中包含4个文件夹
Assets:资源
Library:库文件
ProjectSetting:工程设置文件
Temp:临时文件

工程,场景,游戏对象和组件的关系:
在Unity开发中:一个工程里面有多个场景,一个场景里面有多个游戏对象,每一个游戏对象又有多个组件

Unity组件开发思想
Unity引擎是面向组件开发的,想要游戏对象实现什么样的功能就添加什么样的组件

Transform组件
任何一个游戏对象在场景中都会有位置,旋转,和缩放的基本信息,所以该组件是必须存在的.
transform:当前脚本所挂载的游戏物体的transform
transform可以直接指代当前脚本所挂载的游戏物体
tranform组件 维持父子关系

脚本组件
脚本在创建时候类名必须与脚本名一致,并自动的继承MonoBehaviour类,

Unity脚本组件
Unity脚本类(两大分类):
(Runtime Classes) 实时运行类:游戏运行时执行的类
(Editor Classes) 编辑器类:主要用来实现插件

MonoBehaviour类:
1.Unity脚本组件必须继承MonoBehaviour类
2.继承自MonoBehaviour的脚本组件可以自动调用其封装好了的毁掉方法.

Unity脚本生命周期
Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy

//表示当前脚本被唤醒时被调用
void Awake (){
Debug.Log ("Awake");
}
//表示当前脚本可用时被调用
void OnEnable (){
Debug.Log ("OnEnable");
}
//在update函数第一次执行前被调用
void Start (){
Debug.Log ("Start");
Destroy (gameObject, 3);
}
//游戏运行期间每帧执行一次
void Update (){
Debug.Log ("Update");
//Time.deltaTime 表示当前执行一帧所消耗的时间
}
//固定帧回调函数,固定的时间调用
//一般先于Update
void FixedUpdate (){
Debug.Log ("FixedUpdate");
}
//每次Update执行完会执行该函数
void LateUpdate (){
//永远在Update之后执行
Debug.Log ("LateUpdate");
}
//处理GUI渲染和GUI事件时
void OnGUI (){
Debug.Log ("OnGUI");
}
//当脚本不可用时调用
void OnDisable (){
Debug.Log ("OnDisable");
}
//当脚本被销毁时调用
void OnDestroy (){
Debug.Log ("OnDestroy");
}

Unity脚本组件常用的类

       GameObject类:

     获得游戏物体的tag值:GameObject.tag
    获得游戏物体的名字;GameObject.name
根据对象名找到对应的游戏对象
GameObject.Find ("Sphere");
根据游戏对象的Tag值找到对应的游戏对象
GameObject.FindGameObjectWithTag ("Player");
通过此方法找到的一类拥有同一标签的多个游戏物体,所返回的数组中数组的排列顺序是与游戏物体的创建顺序刚好相反的.
通过Cube上的组件来改变Cube的颜色:GetComponent<MeshRenderer> ().material.color = Color.red;
默认的是该脚本挂载的对象,如果是要改变当前脚本所挂载的游戏对象,可省略gameObject:playerObj.GetComponent<MeshRenderer> ().material.color = Color.green;
设置游戏对象为不可用:enemyObj.SetActive (false);
在3秒后删除游戏对象:Destroy (enemyObj, 3f);

Transform类:

   世界坐标位置:Debug.Log ("position = " + transform.position);
   相对于父物体之间的距离:Debug.Log ("Localpotion = " + transform.localPosition);
   物体的旋转:Debug.Log ("roation = " + transform.rotation);
  相对于世界原点的欧拉角:Debug.Log ("eulerAngle = " + transform.eulerAngles);
  相对于父物体的欧拉角:Debug.Log ("localeulerAngle = " + transform.localEulerAngles);
  缩放:Debug.Log ("scale = " + transform.localScale);
  找到游戏物体的父类:Debug.Log (transform.parent);
  //朝向的游戏物体
public Transform target;
void Update (){
transform.LookAt (target);
//在这是脚本所挂载的游戏物体朝向target,target被游戏物体朝向
Translate:让物体朝着某个方向移动
transform.Translate (new Vector3 (0.01f, 0, 0));
如果relativeTo留空或者设置为Space.Self,移动被应用相对于变换的自身轴。(当在场景视图选择物体时,x、y和z轴显示)如果相对于Space.World 移动被应用相对于世界坐标系统。
另外一种移动方式
transform.position += new Vector3 (0.01f, 0, 0);
物体绕某个轴旋转
transform.Rotate (new Vector3 (0, 10, 0));
绕轴旋转
transform.Rotate (new Vector3 (5, 0, 0), 10);
绕某个点旋转,第二个参数旋转的轴,第一个参数是绕的点,第三个参数旋转的角度
transform.RotateAround (new Vector3 (0, 0, 0), new Vector3 (0, 1, 0), speed);
transform.forward, transform.right, transform.up

Vector3(三维向量)
Vector3是封装了向量相关变量和方法的结构体
Debug.Log ("位置V3向量:" + transform.position);
normalized(属性):表示标准化向量,方向不变,大小为1
Debug.Log ("标准化V3向量:" + transform.position.normalized);
magnitude:V3向量的长度
Debug.Log ("V3向量的长度" + transform.position.magnitude);
sqrMagnitude:V3向量的长度的平方
Debug.Log ("V3向量的长度的平方"+transform.position.sqrMagnitude);

Debug.Log (Vector3.up);//(0,1,0)
Debug.Log (Vector3.down);//(0,-1,0)
Debug.Log (Vector3.right);//(1,0,0)
Debug.Log (Vector3.left);//(-1,0,0)
Debug.Log (Vector3.forward);//(0,0,1)
Debug.Log (Vector3.back);//(0,0,-1)

控制物体移动
transform.Translate (Vector3.left * Time.deltaTime);

Vector3 vec = new Vector3 (6, 8, 10);
Debug.Log ("标准化之前:" + vec);
Normalize和normalized都能得到一个标准化向量,方向和调用者一致,大小都为1,
但使用Normalize会直接更改调用者本身,而使用normalized不会更改调用者
vec.Normalize ();
Debug.Log ("标准化之后:" + vec);

//求小球和Cube之间的距离
(第一个参数是起始位置,第二个是结束位置)
float dis = Vector3.Distance (transform.position, cubeTransform.position);

判断小球和Cube之间的距离小于0.1
确认小球到达Cube了
if (dis >= 0.1f) {
//在Lerp中用到了插值,插值有一个插值系数(<1),第一次移动两物体之间距离*插值系数,第二次移动剩下的的距离*插值系数,只会无限接近于另一个物体,永远不会停止

方法内第一个参数是要移动物体的位置,第二个是移动的目标物体,第三个参数是插值系数
transform.position = Vector3.Lerp (transform.position, cubeTransform.position, 0.02f);
}
获得Cube朝向小球的旋转角度
float angle = Vector3.Angle (cubeTransform.forward, (transform.position - cubeTransform.position));
Debug.Log ("Cube朝向小球的旋转角度:" + angle);

Vector3.Angle(角度):
由from和to两个向量返回一个不大于180°的夹角


Time类:
从游戏开始到现在所有的时间
Debug.Log ("time = " + Time.time);

当前一帧所执行的时间
获取上一次Update()执行的时间到本次Update执行的时间
注;deltaTime的值每一次都是不一样的,是一个不稳定的值
Debug.Log ("deltaTime: " + Time.deltaTime);

固定帧数下,每一帧的执行时间
Debug.Log ("fixedDeltaTime: " + Time.fixedDeltaTime);

表示时间缩放,正的时间缩放为1,如果调成1.5播放速度变快,调成0,时间就会静止
可以做游戏暂停
Debug.Log (Time.timeScale);

Quaternion类:
identity:表示四元数无旋转,常用在创建对象
LookRotation:返回的是一个从自身位置指向向目标位置的向量
//获取到Cube的正前方的视角看向目标点target时要旋转的角度四元数
rote = Quaternion.LookRotation (targetTransform.position - transform.position);
//将要旋转的四元数赋值给Cube,,实现Cube朝向目标点
transform.rotation = Quaternion.Lerp (transform.rotation, rote, Time.deltaTime);

Mathf类:
Lerp:两个浮点数之间进行插值
float temp = Mathf.Lerp (1f, 10f, 0.5f);
//相当于:(10+1)*0.5
Debug.Log ("temp = " + temp);
Clamp:返回一个限制值
//Mathf.Clamp:表示返回最大值和最小值之间的数,
//如果返回的数值小于最小值,那么返回最小值
//如果返回的数值大于最大值,那么返回最大值
//Debug.Log (Mathf.Clamp (Time.time, 1.0f, 3.0f));
Sqr:返回平方根
PI:圆周率 π:3.1415926...

预设体:
预设体是某一游戏对象的集合,使用预设体可使游戏对象或资源重复利用
使用预设体后可以使用脚本控制产生或销毁游戏对象,而不是机械的手动在层级视图上创建.
在代码中使用Instantiate来实现在场景创建游戏物体相当于是一个实例化的过程.

原文地址:https://www.cnblogs.com/zpy1993-09/p/11730551.html