- 最后登录
- 2024-11-17
- 注册时间
- 2012-8-10
- 阅读权限
- 100
- 积分
- 74994
- 纳金币
- 59338
- 精华
- 28
|
pstatus"> 本帖最后由 艾西格亚 于 2013-10-14 03:59 编辑
在前面的教程里面,我们学习到了使用Body Mask功能强化了士兵上半部的动作,使其可以在移动时做出投弹与射击,通过这个部分的学习让我们认识了Mecanim在动画处理上的强大之处。
导读:
五分钟了解Mecanim角色动画系统
http://www.narkii.com/club/thread-305414-1.html
Mecanim动画系统 - 使用Blend Trees控制角色动作
http://www.narkii.com/club/thread-305557-1.html
Mecanim动画系统 - 在角色上使用Mask 叠加动画层
http://www.narkii.com/club/thread-305706-1.html
接下来的教程,我们将要介绍如何在第三人称的角色上面添加更多的控制,需要完成的部分是角色的转向与跳跃,然后在进行瞄准的时候能使角色的上半身跟随做出转动。
下载本教程附件后导入Unity,打开Layers and Masks场景,选择Swat@rifle_jump,这是角色跳跃的动作文件,我们需要对这个文件进行一下设置。
将Animation Type更换为Humanoid模式,Avatar Definition更换为CopyFromOtherAvatar,在Source栏位将SwatAvatar添加进来,按下Apply完成设置。
在Animations的栏位内只勾选Root Transform Rotation > Bake into Pose这个选项,其余的设置保存默认值即可。
打开swatController03动画设置文件,按下Parameters新增三个Bool形态的判断式,分别是Jump、TurnLeft与TurnRight的属性,然后再新增三个State,名称也是Jump、TurnLeft与TurnRight,如图所示:
接下来进行动作的关联设置,如图所示,使用Make Transition方式将Move连接到Jump(双向),Idle分别与Jump、TurnLeft、TurnRight进行连接(双向)。
Transition连接完成后,进行Conditions的设置,Move → Jump、Idle → Jump、Idle → TurnLeft与Idle → TurnRight 皆设置为True, 反向的部分则为False。
设置完成Transition后,将rifle _jump、turn_left与turning_right_45degrees分别添加到Jump、TurnLeft与TurnRight的Motion栏位内。
打开BasicController03的脚本,在 public float transitionTime = 0.25f;后面添加以下的代码:- public float jumpSpeed = 4.0F;
- public float gravity = 20.0F;
- private float jumpPos = 0.0f;
- private float verticalSpeed = 0;
- private float xVelocity = 0.0f;
- private float zVelocity = 0.0f;
复制代码 然后在(controller.isGrounded){之后加入以下的代码:- if (Input.GetKey(KeyCode.Space)) {
- animator.SetBool("Jump", true);
- verticalSpeed = jumpSpeed;
- }else{
- animator.SetBool("Jump", false);
- }
- if(Input.GetKey(KeyCode.Q)){
- animator.SetBool("TurnLeft", true);
- transform.Rotate(Vector3.up * (Time.deltaTime * -45.0f),
- Space.World);
- } else {
- animator.SetBool("TurnLeft", false);
- }
- if(Input.GetKey(KeyCode.E)){
- animator.SetBool("TurnRight", true);
- transform.Rotate(Vector3.up * (Time.deltaTime * 45.0f), Space.
- World);
- } else {
- animator.SetBool("TurnRight", false);
- }
复制代码 上面这段代码主要就是设置了按键的执行功能,分别将Q、E与Space键指定到TurnLeft、TurnRight与Jump的动作上,接着在脚本的最后加上一段代码即可:- void OnAnimatorMove(){
- Vector3 deltaPosition = animator.deltaPosition;
- if(controller.isGrounded){
- xVelocity = animator.GetFloat("Speed") * controller.
- velocity.x * 0.25f;
- zVelocity = animator.GetFloat("Speed") * controller.
- velocity.z * 0.25f;
- }
- verticalSpeed += Physics.gravity.y * Time.deltaTime;
- if(verticalSpeed <= 0){
- animator.SetBool("Jump", false);
- }
- deltaPosition.y = verticalSpeed * Time.deltaTime;
- if(!controller.isGrounded){
- deltaPosition.x = xVelocity * Time.deltaTime;
- deltaPosition.z = zVelocity * Time.deltaTime;
- }
- controller.Move(deltaPosition);
- if ((controller.collisionFlags & CollisionFlags.Below) !=
- 0){
- verticalSpeed = 0;
- }
- transform.rotation = animator.rootRotation;
- }
复制代码 上面的代码主要是以OnAnimatorMove这个功能来判断Controller是否碰触到地面所执行的动作,在写入代码后进行效果的测试,角色移动时按下Q与E键可进行左右的转向,按下空白键则是让角色跳跃。
动作测试没问题后,接着我们需要在角色上面增加一个瞄准点的功能,目的是让这个第三人称的角色在进行瞄准目标时,角色的上半身能够跟着做转向,那么要如何来设置呢?
新增一个名称为MouseAim的C#脚本,写入以下的代码:- using UnityEngine;
- using System.Collections;
- public class MouseAim : MonoBehaviour {
- public Transform spine;
- public Transform armedHand;
- public bool lockY = false;
- public float compensationYAngle = 20.0f;
- public float minAngle = 308.0f;
- public float maxAngle = 31.0f;
- public Texture2D targetAim;
- private Vector2 aimLoc;
- private bool onTarget = false;
-
- public void LateUpdate(){
- Vector3 point = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.farClipPlane));
- if(lockY)
- point.y = spine.position.y;
- Vector3 relativePoint = transform.InverseTransformPoint(point.x, point.y, point.z);
- if(relativePoint.z < 0){
- Vector3 inverseZ = transform.InverseTransformPoint(relativePoint.x,relativePoint.y,-relativePoint.z);
- point = inverseZ;
- }
- spine.LookAt(point, Vector3.up);
- Vector3 comp = spine.localEulerAngles;
- comp.y = spine.localEulerAngles.y + compensationYAngle;
- spine.localEulerAngles = comp;
- if(spine.localEulerAngles.y > maxAngle && spine.localEulerAngles.y < minAngle){
- if(Mathf.Abs((spine.localEulerAngles.y - minAngle)) < Mathf.Abs((spine.localEulerAngles.y - maxAngle))){
- Vector3 min = spine.localEulerAngles;
- min.y = minAngle;
- spine.localEulerAngles = min;
- } else {
- Vector3 max = spine.localEulerAngles;
- max.y = maxAngle;
- spine.localEulerAngles = max;
- }
- }
- RaycastHit hit;
- if(Physics.Raycast(armedHand.position,point, out hit)){
- onTarget = true;
- aimLoc = Camera.main.WorldToViewportPoint(hit.point);
- }else{
- onTarget = false;
- aimLoc = Camera.main.WorldToViewportPoint(point);
-
- }
- }
-
- void OnGUI(){
- int sw = Screen.width;
- int sh = Screen.height;
- GUI.DrawTexture(new Rect(aimLoc.x * sw - 8, sh - (aimLoc.y * sh) -8, 16, 16), targetAim, ScaleMode.StretchToFill, true, 10.0f);
- }
-
- }
复制代码 这段代码主要是将鼠标在屏幕上的位置转换成场景的空间坐标,然后以LookAt()来旋转角色的躯干(上半身),同时必须保持目标点在角色的后方,才能让角色一直保持正确的瞄准点位置。
接着将MouseAim.cs的脚本拖曳到士兵模型,在Inspector里面需要对几个栏位进行设置。
将士兵模型物件里面的Spine添加到MouseAim> Spine,RightHand添加到ArmedHand的栏位,将GUI 目录下的crossAim贴图添加到Target Aim的栏位内。
设置完成后进行测试,现在角色的上半身已经可以跟随鼠标的移动做出转向。
另外我们还可以搭配KGFMapSystem来制作迷你地图,如图所示,右上方黄色的小箭头即为士兵模型在场景中的位置。
KGFMapSystem 2.3 下载位置:
http://www.narkii.com/club/thread-304320-1.html
KGFMapSystem - 快速创建游戏中的迷你地图
http://www.narkii.com/club/thread-289124-1.html
更多的Unity技术交流与分享请加入:纳金网Unity论坛专属交流群 - 218689657
|
|