Transform.TransformPoint //可以将坐标点从局部坐标系转换到全局坐标系
Transform.InverseTransformPoint //可以将坐标点从全局坐标转换到局部坐标系
Transform.TransformDirection // 对向量从局部坐标转换到全局坐标
Transform.InverseTransformDirection // 对向量从全局坐标转换到局部坐标
向量
Vector3类的常用成员变量和方法
normalized 得到单位化后的向量(只读)
magnitude 得到向量长度(只读)
sqrmagnitude 得到向量长度平方(只读)
Cross
Dot
Project 计算向量在另一向量的投影
Angle返回两个向量之间的夹角
Distance 返回两个向量之间的距离
operator+ 向量相加
operator- 向量相减
operator* 向量乘以标量
operator/ 向量除以标量
operator ==
operator !=
GameObject.Find(" ")// 同级目录
Vector3.Lerp()//实现缓动效果
矩阵(Matrix)
平移矩阵:T(p) = 1 0 0 0
0 1 0 0
0 0 1 0
Px Py Pz 1
旋转矩阵: X(x) = 1 0 0 0
0 cosx sinx 0
0 -sinx cosx 0
0 0 0 1
缩放矩阵 S(q) = q(x) 0 0 0
0 q(y) 0 0
0 0 q(z) 0
0 0 0 1
其次坐标:就是将原来三维的向量用四维向量来表示。
引入其次坐标的目的是:
1,更好区分向量和点。三维空间中三维坐标既可以表示点也可以表示向量;但是引入其次坐标,用(x,y,z,1)表示坐标点,用(x,y,z,0)来表示向量。
2,统一用矩阵乘法表示平移、旋转、缩放变换。使用3x3矩阵,矩阵乘法只能表示旋转和缩放,不能表示平移。而在4x4其次空间中,可以使用4x4的其次矩阵来统一表示平移,旋转和缩放变量。
3,当分量w=0可以用来表示无穷远的点。
四元数:
3种旋转的表示方法:
欧拉角 矩阵 四元数
旋转一个位置点 不支持 支持 不支持
增量旋转 不支持 支持,速度慢 支持,速度快
平滑插值 支持 基本不支持 支持
内存占用 3个数值 16个数值 4个数值
表达是否唯一 无数种组合 唯一 互为负的两种表示
可能会遇到的问题 万向锁 矩阵蠕变 误差累积导致非法
Quaternion类的变量列表
x
y
z
w
this[int index]
eulerAngles 返回表示该旋转的欧拉角
identiy 返回同一象限的四元素,即该四元数表示没有旋转。
函数列表:
Set 设置Quaternion的x,y,z,w分量;
ToAngleAxis 将四元数转换成一个角-轴表示的旋转
SetFromToRotation 设置一个四元数表示fromDirection到toDirection的旋转
SetLookRotation 设置一个四元数表示朝向为forward,上方向为up的旋转
ToString 将四元数转成格式化的字符串
operator* 连接两个旋转,该相乘操作的结果的作用相当于依次应用两个旋转操作
operator==
operator!=
Dot 两个旋转点乘
AngleAxis 根据旋转角和旋转轴创建一个四元数
FromToRotation 生成一个四元数 表示fromDirection到toDirection的旋转
LookRotation 生成一个四元数表示朝向forward,上方向为up的旋转
Slerp 根据t值在四元数from和to之间进行球形插值
Lerp 根据t值在四元数from和to之间进行插值,并将结果规范化
RotateTowards 将旋转from变到旋转to
Inverse 返回旋转的逆
Angle 返回a和b两个旋转之间的夹角角度
Euler 返回一个先沿z轴旋转z角度,然后沿x轴旋转x角度,最后沿y轴旋转y角度的旋转
For example:
用键盘上下左右控制sphere,cube一直朝向sphere;
using UnityEngine;
using System.Collections;
public class MotionScript : MonoBehaviour {
public float speed = 3f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Translate(Input.GetAxis("Horizontal") * speed * Time.deltaTime, 0, 0);
transform.Translate(0, Input.GetAxis("Vertical") * speed * Time.deltaTime, 0);
}
}
using UnityEngine;
using System.Collections;
public class LookAsScript : MonoBehaviour {
public Transform target;
// Use this for initialization
void Start () {
target = GameObject.Find("Sphere").transform;
}
// Update is called once per frame
void Update () {
Vector3 relativePos = target.position - transform.position;
transform.rotation = Quaternion.LookRotation(relativePos);
}
}
c#脚本编写注意:
1,凡是需要添加到游戏对象的c#脚本类都需要直接或间接地从MonoBehaviour类继承;
2,避免使用构造函数;
3,类名要与脚本文件名相同,这里的类是从MonoBehaviour继承的行为类,普通c#类可以随便命名;
4,协同函数Coroutines返回类型必须是IEnumerator,并且用yield return 替代yield。
访问游戏对象和组件
MonoBehaviour类
事件响应函数
OnMouseEnter 鼠标移入GUI控件或者碰撞体时调用;
OnMouseOver 鼠标停留在GUI控件或者碰撞体时调用;
OnMouseExit 鼠标移出GUI控件或者碰撞体时调用;
OnMouseDown 鼠标在GUI控件或者碰撞体上按时调用;
OnMouseUp 鼠标按键释放时调用;
OnTriggerEnter 当其他碰撞体进入触发器时调用;
OnTriggerExit 当其他碰撞体离开触发器时调用;
OnTriggerStay 当其他碰撞体停留在触发器时调用;
OnCollisionEnter 当其他碰撞体或者刚体与其他碰撞体或者刚体接触时调用;
OnCollisionExit 当其他碰撞体或者刚体与其他碰撞体或者刚体停止接触时调用;
OnCollisionStay 当其他碰撞体或者刚体与其他碰撞体或者刚体保持接触时调用;
OnControllerColliderHit 当控制器移动时与碰撞体发生碰撞时调用;
OnBecameVisible 对于任意一个相机可用时调用;
OnBecameInvisible 对于任意一个相机不可用时调用;
OnEnable 对象启用或者激活时调用;
OnDisable 对象禁用或者取消激活时调用;
OnDestroy 脚本销毁时调用;
OnGUI 渲染GUI 和处理GUI消息时调用;
访问游戏对象:
1,通过名称来查找
GameObject.Find
若存在,返回该对象的引用;若不存在,返回NULL;若存在多个,返回第一个对象的引用。
GameObject player;
GameObject obj;
void Start()
{
obj = GameObject.Find("MainHero");
}
2,通过标签查找
GameObject.FindWithTag
若场景中存在该标签的游戏对象,那么返回该对象的引用;否则返回null;若多个对象使用同一标签,那么返回第一个对象的引用;若场景中有多个相同标签的游戏对象,可以通过你FindGameObjectsWithTag()方法获取游戏对象数组。
GameObject player;
GameObject[] enemies;
void Start()
{
player = GameObject.FindWithTag("Player");
enemies = GameObject.FindWithTag("Player");
}
19.5.3
对付