【发布时间】:2016-10-28 12:16:23
【问题描述】:
这是我正在使用的附加到主摄像机的脚本。 我可以将相机旋转 360 度。但是角色(ThirdPersonController)一直保持空闲,面对同一个位置。
我想当我旋转相机时,角色也会旋转。
我遇到的一个问题是我可以将它旋转到地面下方一点。 如何将相机旋转限制在地面/地形水平? 这是一个截图,我的意思是相机在地形/角色下面:
这是脚本代码: 我尝试添加这条线以使用相机旋转角色,但它没有这样做,它什么也不做。
transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed);
脚本:
using UnityEngine;
using System.Collections;
[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")]
public class MouseOrbitImproved : MonoBehaviour
{
public Transform target;
public float distance = 5.0f;
public float xSpeed = 120.0f;
public float ySpeed = 120.0f;
public float yMinLimit = -20f;
public float yMaxLimit = 80f;
public float distanceMin = .5f;
public float distanceMax = 15f;
private Rigidbody rigidbody;
float x = 0.0f;
float y = 0.0f;
public float rotationSpeed = 5f;
// Use this for initialization
void Start()
{
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
rigidbody = GetComponent<Rigidbody>();
// Make the rigid body not change rotation
if (rigidbody != null)
{
rigidbody.freezeRotation = true;
}
}
void LateUpdate()
{
if (target)
{
x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
y = ClampAngle(y, yMinLimit, yMaxLimit);
Quaternion rotation = Quaternion.Euler(y, x, 0);
distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel") * 5, distanceMin, distanceMax);
RaycastHit hit;
if (Physics.Linecast(target.position, transform.position, out hit))
{
distance -= hit.distance;
}
Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
Vector3 position = rotation * negDistance + target.position;
transform.rotation = rotation;
transform.position = position;
transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed);
}
}
public static float ClampAngle(float angle, float min, float max)
{
if (angle < -360F)
angle += 360F;
if (angle > 360F)
angle -= 360F;
return Mathf.Clamp(angle, min, max);
}
}
我创建了一个新的小干净脚本,它应该根据相机旋转来旋转角色。上述脚本附加到主摄像机。
现在我有了 ThirdPersonController 并且已经附加了一个脚本:
using UnityEngine;
using System.Collections;
public class ClickToMove : MonoBehaviour
{
public int speed = 5; // Determines how quickly object moves towards position
public float rotationSpeed = 5f;
private Vector3 targetPosition;
private Animator _animator;
private Vector3 destination;
private Quaternion targetRotation;
void Start()
{
_animator = GetComponent<Animator>();
_animator.CrossFade("Idle", 0);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
_animator.CrossFade("Walk", 0);
Plane playerPlane = new Plane(Vector3.up, transform.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float hitdist = 0.0f;
if (playerPlane.Raycast(ray, out hitdist))
{
Vector3 targetPoint = ray.GetPoint(hitdist);
targetPosition = ray.GetPoint(hitdist);
targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
destination = targetPosition;
}
}
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed);
if ((transform.position - destination).magnitude < 0.7f)
{
_animator.CrossFade("Idle", 0);
}
}
}
这个脚本运行良好。上面还有旋转相机的脚本。 但是一旦我附加到 ThirdPersonController 应该旋转角色的新小脚本,所以首先它不旋转角色,其次它使角色向前走,整个 ClickToMove 脚本都不能正常工作。
using UnityEngine;
using System.Collections;
public class RotateCharacterToCamera : MonoBehaviour {
void Update () {
Vector3 characterPosition = transform.position;
Vector3 cameraPosition = Camera.main.transform.position;
Vector3 delta = new Vector3(characterPosition.x - characterPosition.x, 0.0f, characterPosition.z - characterPosition.z);
transform.LookAt(delta);
}
}
【问题讨论】: