1.人体模型
Unity Assets Store中的Robot Kyle作为人体模型。首先,在Unity Asset Store中添加Robot Kyle,然后在Window-Package Manager中导入Robot Kyle。点击Project-Robot Kyle-Model-Robot Kyle,在侧边栏中点击inspector-Rig,把Animation Type改成Humanoid。最后,把Robot Kyle资产拖入场景形成实例即可。
2.人体运动状态与动画
首先,在Unity Asset Store中添加Unity Standard Asset。其次,在Window-Package Manager中导入Unity Standard Asset(只需要导入Cameras、Characters、CrossPlatformInput、Utility),注意此时会有一个编译错误,需要在报错的脚本import UnityEngine.UI。解决报错以后,给Robot Kyle新建一个Animator,在Animator中添加两个float变量:Speed和Direction,分别控制平动和转动。
首先,把Project-Standard Assets-Characters-ThirdPersonCharacter-Animation中的HumanoidIdle和HumanoidRun导入Animator,设置Speed超过一定值时进入HumanoidRun,Speed超过一定值时返回HumanoidIdle。
2.摄像机视角控制
具体参考此视频。
1.第三人称视角给mainCamera增加控制脚本,脚本获取mainCamera的Transform的Component,然后设置一个public的元素target作为跟踪目标,在update函数中吧摄像机臂的一端固定在target,臂的方向由鼠标移动来控制。
2.第一人称视角把第三人称视角的摄像机臂长设为0,即可得到第一人称视角。
3.摄像机臂长度随俯仰角变换在相机控制脚本中添加一个[SerializeField]的AnimationCurve成员_animationCurve,输入的是俯仰角,输出的是臂长和标准长度的比例,在俯仰角等于-90的时候,_animationCurve输出0,当俯仰角等于90的时候,_animationCurve输出1,中间线性变换。原摄像机臂长乘以_animationCurve即可得到改变以后的臂长。
关键代码如下:
//Photographer.cs
public class Photographer:MonoBehaviour
{
//Start is called before the first frame update
public Transform target;
private Transform _transform;
public float Yaw{get;private set;}
public float Pitch{get;private set;}
public float mouseSensitivity=5;
public float armLength=1;
[SerializeField]private AnimationCurve _animationCurve;
public void SetYaw(float yaw)
{
Yaw=yaw;
}
private void Awake()
{
_transform=GetComponent<Transform>();
_transform.position=target.position;
}
//Update is called once per frame
void Update()
{
float y=Input.GetAxis("Mouse Y");
float s=Input.GetAxis("Mouse ScrollWheel");
armLength=Mathf.Clamp(armLength+s,0,10);
Pitch+=y*mouseSensitivity;
Pitch=Mathf.Clamp(Pitch,-90,90);
_transform.rotation=Quaternion.Euler(Pitch,Yaw,0);
_transform.position=target.position+armLength_animationCurve.Evaluate(Pitch)(_transform.rotation*Vector3.back).normalized;
}
}