我尝试了各种写法发现都不对,从网上找到了正确的写法,要转向这个物体 ,是距离相减,然后
Quaternion.LookRotation
然后四元素 转换为vector3,.DOTWEEN是一个封装框架,也可以自己用差值器实现。
下面是我自己写的差值器调用
//参数1 为相机,参数2 为物体 ,
public static Coroutine postRotateLookAt(Transform transform1, Transform transform2, float execTime)
{
{
TaskObj taskObj = new TaskObj();
taskObj.execFrame = 0.01f;//多少秒执行一次逻辑
taskObj.needTime = execTime;
taskObj.action = delegate ()
{
Vector3 dir = transform2.transform.position - transform1.position;
Quaternion rot = Quaternion.LookRotation(dir);
transform1.rotation = Quaternion.Lerp(transform2.rotation, rot, taskObj.currentTime * taskObj.needTime);
};
return GlobalClick.getInstance().startTask(taskObj);
}
}
public class TaskObj
{
public Action action;
public float needTime;
public float currentTime;
public Transform transform1;
public float execFrame = 0.1f;
public Transform transform2;
}
public IEnumerator loopExec(TaskObj taskObj)
{
while (taskObj.currentTime <taskObj.needTime)
{
taskObj.action.Invoke();
yield return new WaitForSeconds(taskObj.execFrame);
taskObj.currentTime += taskObj.execFrame;
}
yield return null;
}
public Coroutine startTask(TaskObj taskObj)
{
return StartCoroutine(loopExec(taskObj));
}
上面的时间差参数 写的有点问题
public class TestLookAt : MonoBehaviour
{
// Start is called before the first frame update
public GameObject gameObject1;
public GameObject gameObject2;
void Start()
{
postRotateLookAt(gameObject1.transform, gameObject2.transform,3);
}
// Update is called once per frame
void Update()
{
}
public IEnumerator loopExec(TaskObj taskObj)
{
while (taskObj.currentTime < taskObj.needTime)
{
taskObj.action.Invoke();
print("调用" + taskObj.currentTime);
yield return new WaitForSeconds(taskObj.execFrame);
taskObj.currentTime += taskObj.execFrame;
print("调用over" + taskObj.currentTime);
}
print("结束");
yield return null;
}
public Coroutine startTaskTest(TaskObj taskObj)
{
return StartCoroutine(loopExec(taskObj));
}
public Coroutine postRotateLookAt(Transform transform1, Transform transform2, float execTime)
{
{
TaskObj taskObj = new TaskObj();
taskObj.execFrame = 0.01f;//多少秒执行一次逻辑
taskObj.needTime = execTime;
taskObj.action = delegate ()
{
Vector3 dir = transform2.transform.position - transform1.position;
Quaternion rot = Quaternion.LookRotation(dir);
float times = taskObj.currentTime / taskObj.needTime*1.0f;
print("times" + times);
transform1.rotation = Quaternion.Lerp(transform1.rotation, rot, times);
};
return startTaskTest(taskObj);
}
}
}
第三方实现DOTWEEN
Vector3 dir = gameObject.transform.position - Camera.main.transform.position;
Quaternion rot = Quaternion.LookRotation(dir);
Camera.main.transform.DORotate(new Vector3(rot.eulerAngles.x, rot.eulerAngles.y, rot.eulerAngles.z), 1.5f, RotateMode.Fast);
网友评论