8.2.2 SetLookRotation方法:设置Quaternion实例的朝向
基本语法:(1)public void SetLookRotation(Vector3 view);
(2)public void SetLookRotation(Vector3 view, Vector3 up);
功能说明:此方法的功能是用来对一个Quaternion实例的朝向进行设置。设有如下代码:
Quaternion q1 = Quaternion.identity;
q1.SetLookRotation(v1, v2);
transform.rotation = q1;
则:
(1)transform.forward方向与v1方向相同;
(2)transform.right垂直于由Vector3.zero、v1和v2三点构成的平面;
(3)v2的作用除了与Vector3.zero和v1构成平面来决定transform.right的方向外,还用来决定transform.up的朝向,因为当transform.forward和transform.right方向确定后,transform.up方向剩下两种可能,到底选用哪一种便由v2来影响,transform.up方向的选取方式总会使得transform.up的方向和v2的方向的夹角小于或等于90度。当然,一般情况下v2.normalized和transform.up是不相同的。
(4)当v1为Vector3.zero时方法失效,即不要在使用此方法时把v1设置成Vector3.zero。
提示:不可以直接使用transform.rotation.SetLookRotation(v1,v2)的方式来使用SetLookRotation方法,否则会不起作用。应该使用上述代码所示的方式,首先实例化一个Quaternion,然后对其使用SetLookRotation,最后将其赋给transform.rotation。
实例演示:下面通过实例演示方法SetLookRotation的使用。
using UnityEngine;
using System.Collections;
public class SetLookRotation_ts : MonoBehaviour
{
public Transform A, B, C;
Quaternion q1 = Quaternion.identity;
void Update()
{
//不可直接使用C.rotation.SetLookRotation(A.position,B.position);
q1.SetLookRotation(A.position, B.position);
C.rotation = q1;
//分别绘制A、B和C.right的朝向线
//请在Scene视图中查看
Debug.DrawLine(Vector3.zero, A.position, Color.red);
Debug.DrawLine(Vector3.zero, B.position, Color.green);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.right * 2.5f), Color.yellow);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.forward * 2.5f), Color.gray);
//分别打印C.right与A、B的夹角
Debug.Log("C.right与A的夹角:" + Vector3.Angle(C.right, A.position));
Debug.Log("C.right与B的夹角:" + Vector3.Angle(C.right, B.position));
//C.up与B的夹角
Debug.Log("C.up与B的夹角:" + Vector3.Angle(C.up, B.position));
}
}
8.3.7 LookRotation方法:设置Quaternion的朝向
基本语法:(1)public static Quaternion LookRotation(Vector3 forward);
(2)public static Quaternion LookRotation(Vector3 forward, Vector3upwards);
其中参数forward为返回Quaternion的forward朝向。
功能说明:此方法用于返回一个Quaternion实例,使GameObject对象的Z轴朝向参数forward方向。此方法与方法SetLookRotation(view : Vector3, up : Vector3 = Vector3.up)功能相同,只是用法上有些不同。
实例演示:下面通过实例演示方法LookRotation的使用。
using UnityEngine;
using System.Collections;
public class LookRotation_ts : MonoBehaviour
{
public Transform A, B, C, D;
Quaternion q1 = Quaternion.identity;
void Update()
{
//使用实例方法
//不可直接使用C.rotation.SetLookRotation(A.position,B.position);
q1.SetLookRotation(A.position, B.position);
C.rotation = q1;
//使用类方法
D.rotation = Quaternion.LookRotation(A.position, B.position);
//绘制直线,请在Scene视图中查看
Debug.DrawLine(Vector3.zero, A.position, Color.white);
Debug.DrawLine(Vector3.zero, B.position, Color.white);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 2.5f), Color.white);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.forward * 2.5f), Color.white);
Debug.DrawLine(D.position, D.TransformPoint(Vector3.up * 2.5f), Color.white);
Debug.DrawLine(D.position, D.TransformPoint(Vector3.forward * 2.5f), Color.white);
}
}
在这段代码中,首先声明了4个Transform变量用于指向不同的对象,然后在Update方法中调用方法SetLookRotation使得C的Z轴方向与向量A相同,Y轴方向尽量接近向量B。接着调用静态方法LookRotation使得D的Z轴方向与向量A相同,Y轴方向尽量接近向量B,如图8-9所示。请读者自行运行程序在Scene视图而非Game视图中查看。程序运行时可以在Scene视图中试着拖动A或B的位置观察C和D的变化。
本文章摘自图书《Unity API解析》,源码下载地址:http://www.ituring.com.cn/book/1474