using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class jsyidong : MonoBehaviour {
/// <summary>
/// 移动的目标点
/// </summary>
private Vector3 TargetPos = Vector3.zero;
/// <summary>
/// 移动速度
/// </summary>
[SerializeField]
private float m_Speed = 10f;
/// <summary>
/// 角色控制器
/// </summary>
private CharacterController characterController;
/// <summary>
/// 定义一个转身的速度
/// </summary>
private float RotationSpeed = 0.2f;
/// <summary>
/// 定义转身的目标方向 这是一个四元数
/// </summary>
private Quaternion TargeQuaternion;
/// <summary>
/// 定义是否已经转生
/// </summary>
private bool RotationOver = false;
// Use this for initialization
void Start () {
//查找获取组件
characterController = GetComponentInChildren <CharacterController>();
}
// Update is called once per frame
void Update () {
//为了防止找不见的情况下进行碰撞
if (characterController == null) return;
//点击屏幕 输入鼠标抬起事件
if(Input.GetMouseButtonUp(0))
{
//射线 主摄像机 摄像机到屏幕一点 鼠标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//检测光线碰撞投射信息
RaycastHit hitInfo;
//要进行碰撞
if(Physics.Raycast(ray,out hitInfo))
{
//如果碰到地面返回一个点 在这里需要定义一个点 移动的目标点
if (hitInfo.collider.gameObject.name.Equals("Ground", System.StringComparison.CurrentCultureIgnoreCase))
{
TargetPos = hitInfo.point;
RotationOver = false;//当点击屏幕的时候让他变为false
RotationSpeed = 0;//转身速度在鼠标点击屏幕的时候让他变为0
}
}
}
//判断主角是否着地 角色控制器自带IsGrounded 如果角色不在地面能让角色瞬间着地
if(characterController.isGrounded)
{
//目标点减去当前的这个点就是方向 这样就能接地面了 Y轴1000
characterController.Move((transform.position + new Vector3(0, 1000, 0)) - transform.position);
}
if(TargetPos!=Vector3.zero)
{
if(Vector3.Distance(TargetPos,transform.position)>0.1f)//Disney两点之间的距离
{
// 方向 目标点减去当前坐标点
Vector3 direction = TargetPos - transform.position;
direction = direction.normalized;//方向归一化 就是X Y Z 的方向变成1 再乘以我们的速度
direction = direction * Time.deltaTime * m_Speed;
direction.y = 0;//同时Y轴的方向也要变为0
//修改朝向
//transform.LookAt(TargetPos);
//transform.LookAt(new Vector3(TargetPos.x,transform.position.y,TargetPos.z));//修改朝向 x z是我们要修改的朝向 y轴不是所以y轴就取角色的点就行
//平移
//transform.Translate(Vector3.forward * Time.deltaTime * m_Speed);
//让角色缓慢转身 判断是否转身
if (!RotationOver)
{
//在这可以更改转身速度
RotationSpeed += 0.2f;
//让角色缓慢转身 看旋转
TargeQuaternion = Quaternion.LookRotation(direction);
//现在让角色转身 Lerp差值 旋转角度 定义的旋转方向 平稳速度
transform.rotation = Quaternion.Lerp(transform.rotation, TargeQuaternion, Time.deltaTime * RotationSpeed);
//判断两个夹角的角度很小的话就让这个差值小于1
//if (Quaternion.Angle(TargeQuaternion, transform.rotation) < 1f)
//{
// RotationSpeed = 1;//旋转速度等于1
// RotationOver = true;//当角度小于1的时候就认为转生已经完成
//}
if(RotationSpeed<=1)
{
RotationSpeed += 5f * Time.deltaTime;
TargeQuaternion = Quaternion.Lerp(transform.rotation, TargeQuaternion, RotationSpeed);
}
}
characterController.Move(direction);
}
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class jsyidong : MonoBehaviour {
/// <summary>
/// 移动的目标点
/// </summary>
private Vector3 TargetPos = Vector3.zero;
/// <summary>
/// 移动速度
/// </summary>
[SerializeField]
private float m_Speed = 10f;
/// <summary>
/// 角色控制器
/// </summary>
private CharacterController characterController;
/// <summary>
/// 定义一个转身的速度
/// </summary>
private float RotationSpeed = 0.2f;
/// <summary>
/// 定义转身的目标方向 这是一个四元数
/// </summary>
private Quaternion TargeQuaternion;
/// <summary>
/// 定义是否已经转生
/// </summary>
private bool RotationOver = false;
// Use this for initialization
void Start () {
//查找获取组件
characterController = GetComponentInChildren <CharacterController>();
}
// Update is called once per frame
void Update () {
//为了防止找不见的情况下进行碰撞
if (characterController == null) return;
//点击屏幕 输入鼠标抬起事件
if(Input.GetMouseButtonUp(0))
{
//射线 主摄像机 摄像机到屏幕一点 鼠标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//检测光线碰撞投射信息
RaycastHit hitInfo;
//要进行碰撞
if(Physics.Raycast(ray,out hitInfo))
{
//如果碰到地面返回一个点 在这里需要定义一个点 移动的目标点
if (hitInfo.collider.gameObject.name.Equals("Ground", System.StringComparison.CurrentCultureIgnoreCase))
{
TargetPos = hitInfo.point;
RotationOver = false;//当点击屏幕的时候让他变为false
RotationSpeed = 0;//转身速度在鼠标点击屏幕的时候让他变为0
}
}
}
//判断主角是否着地 角色控制器自带IsGrounded 如果角色不在地面能让角色瞬间着地
if(characterController.isGrounded)
{
//目标点减去当前的这个点就是方向 这样就能接地面了 Y轴1000
characterController.Move((transform.position + new Vector3(0, 1000, 0)) - transform.position);
}
if(TargetPos!=Vector3.zero)
{
if(Vector3.Distance(TargetPos,transform.position)>0.1f)//Disney两点之间的距离
{
// 方向 目标点减去当前坐标点
Vector3 direction = TargetPos - transform.position;
direction = direction.normalized;//方向归一化 就是X Y Z 的方向变成1 再乘以我们的速度
direction = direction * Time.deltaTime * m_Speed;
direction.y = 0;//同时Y轴的方向也要变为0
//修改朝向
//transform.LookAt(TargetPos);
//transform.LookAt(new Vector3(TargetPos.x,transform.position.y,TargetPos.z));//修改朝向 x z是我们要修改的朝向 y轴不是所以y轴就取角色的点就行
//平移
//transform.Translate(Vector3.forward * Time.deltaTime * m_Speed);
//让角色缓慢转身 判断是否转身
if (!RotationOver)
{
//在这可以更改转身速度
RotationSpeed += 0.2f;
//让角色缓慢转身 看旋转
TargeQuaternion = Quaternion.LookRotation(direction);
//现在让角色转身 Lerp差值 旋转角度 定义的旋转方向 平稳速度
transform.rotation = Quaternion.Lerp(transform.rotation, TargeQuaternion, Time.deltaTime * RotationSpeed);
//判断两个夹角的角度很小的话就让这个差值小于1
//if (Quaternion.Angle(TargeQuaternion, transform.rotation) < 1f)
//{
// RotationSpeed = 1;//旋转速度等于1
// RotationOver = true;//当角度小于1的时候就认为转生已经完成
//}
if(RotationSpeed<=1)
{
RotationSpeed += 5f * Time.deltaTime;
TargeQuaternion = Quaternion.Lerp(transform.rotation, TargeQuaternion, RotationSpeed);
}
}
characterController.Move(direction);
}
}
}
}