在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识是我们开始学习今天内容的基础。
1、Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在-1到1之间。这段话怎么理解呢?我们来看下面这段脚本:
- using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- //水平速度
- public float HorizontalSpeed = 2.0F;
- //垂直速度
- public float VerticalSpeed = 2.0F;
- void Update()
- {
- //水平方向
- float h = HorizontalSpeed * Input.GetAxis("Mouse X");
- //垂直方向
- float v = VerticalSpeed * Input.GetAxis("Mouse Y");
- //旋转
- transform.Rotate(v, h, 0);
- }
- }
在后面,我们还将使用这种方式,大家可以对这个方法有进一步的了解。
2、欧拉角eulerAngles:该值是Vector3类型的值,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该值最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本:
- float mY = 5.0;
- void Update ()
- {
- mY += Input.GetAxis("Horizontal");
- transform.eulerAngles =new Vector3(0,mY, 0);
- }
3、插值:所谓插值是指在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插值的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插值方法,即线性插值Lerp,球形插值SLerp。我们来看下面的脚本:
- void Rotating (float horizontal, float vertical)
- {
- // Create a new vector of the horizontal and vertical inputs.
- Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);
- // Create a rotation based on this new vector assuming that up is the global y axis.
- Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
- // Create a rotation that is an increment closer to the target rotation from the player's rotation.
- Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);
- // Change the players rotation to this new rotation.
- rigidbody.MoveRotation(newRotation);
- }
好了,有了这三部分的基础,我们就可以开始今天的内容了,今天的脚本分为两个部分,第一部分是角色控制的部分,主要负责的角色在场景中的移动、转身和动画处理。第二部分是相机控制的部分,主要涉及相机旋转、相机缩放的相关内容。下面,我们分别来讲这两个部分,场景依然是做的小游戏:
本次的主角呢,是大家非常喜欢的角色谢沧行,好了,我们回到今天的内容里吧!在第一部分,主要的是完成角色向各个方向的转身,这里我们定义四个方向(其实八个方向是一样的!),脚本如下:
- using UnityEngine;
- using System.Collections;
- public class NoLockiVew_Player : MonoBehaviour {
- /*自由视角下的角色控制*/
- /*作者:秦元培*/
- //玩家的行走速度
- public float WalkSpeed=1.5F;
- //重力
- public float Gravity=20;
- //角色控制器
- private CharacterController mController;
- //动画组件
- private Animation mAnim;
- //玩家方向,默认向前
- private DirectionType mType=DirectionType.Direction_Forward;
- [HideInInspector]
- //玩家状态,默认为Idle
- public PlayerState State=PlayerState.Idle;
- //定义玩家的状态枚举
- public enum PlayerState
- {
- Idle,
- Walk
- }
- //定义四个方向的枚举值,按照逆时针方向计算
- protected enum DirectionType
- {
- Direction_Forward=90,
- Direction_Backward=270,
- Direction_Left=180,
- Direction_Right=0
- }
- void Start ()
- {
- //获取角色控制器
- mController=GetComponent<CharacterController>();
- //获取动画组件
- mAnim=GetComponentInChildren<Animation>();
- }
- void Update ()
- {
- MoveManager();
- //MouseEvent();
- }
- //玩家移动控制
- void MoveManager()
- {
- //移动方向
- Vector3 mDir=Vector3.zero;
- if(mController.isGrounded)
- {
- //将角色旋转到对应的方向
- if(Input.GetAxis("Vertical")==1)
- {
- SetDirection(DirectionType.Direction_Forward);
- mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
- mAnim.CrossFade("Walk",0.25F);
- State=PlayerState.Walk;
- }
- if(Input.GetAxis("Vertical")==-1)
- {
- SetDirection(DirectionType.Direction_Backward);
- mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
- mAnim.CrossFade("Walk",0.25F);
- State=PlayerState.Walk;
- }
- if(Input.GetAxis("Horizontal")==-1)
- {
- SetDirection(DirectionType.Direction_Left);
- mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
- mAnim.CrossFade("Walk",0.25F);
- State=PlayerState.Walk;
- }
- if(Input.GetAxis("Horizontal")==1)
- {
- SetDirection(DirectionType.Direction_Right);
- mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
- mAnim.CrossFade("Walk",0.25F);
- State=PlayerState.Walk;
- }
- //角色的Idle动画
- if(Input.GetAxis("Vertical")==0 && Input.GetAxis("Horizontal")==0)
- {
- mAnim.CrossFade("Idle",0.25F);
- State=PlayerState.Idle;
- }
- }
- //考虑重力因素
- mDir=transform.TransformDirection(mDir);
- float y=mDir.y-Gravity *Time.deltaTime;
- mDir=new Vector3(mDir.x,y,mDir.z);
- mController.Move(mDir);
- }
- //设置角色的方向,有问题
- void SetDirection(DirectionType mDir)
- {
- if(mType!=mDir)
- {
- transform.Rotate(Vector3.up*(mType-mDir));
- mType=mDir;
- }
- }
- }