纳金网
标题:
Mecanim教程 - 射击瞄准点与角色动作的结合
[打印本页]
作者:
艾西格亚
时间:
2013-10-14 03:45
标题:
Mecanim教程 - 射击瞄准点与角色动作的结合
本帖最后由 艾西格亚 于 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,这是角色跳跃的动作文件,我们需要对这个文件进行一下设置。
2013-10-14 03:20 上传
下载附件
(55.8 KB)
将Animation Type更换为Humanoid模式,Avatar Definition更换为CopyFromOtherAvatar,在Source栏位将SwatAvatar添加进来,按下Apply完成设置。
2013-10-14 03:20 上传
下载附件
(41.81 KB)
在Animations的栏位内只勾选Root Transform Rotation > Bake into Pose这个选项,其余的设置保存默认值即可。
2013-10-14 03:20 上传
下载附件
(64.69 KB)
打开swatController03动画设置文件,按下Parameters新增三个Bool形态的判断式,分别是Jump、TurnLeft与TurnRight的属性,然后再新增三个State,名称也是Jump、TurnLeft与TurnRight,如图所示:
2013-10-14 03:20 上传
下载附件
(65.23 KB)
接下来进行动作的关联设置,如图所示,使用Make Transition方式将Move连接到Jump(双向),Idle分别与Jump、TurnLeft、TurnRight进行连接(双向)。
2013-10-14 03:20 上传
下载附件
(67.91 KB)
Transition连接完成后,进行Conditions的设置,Move → Jump、Idle → Jump、Idle → TurnLeft与Idle → TurnRight 皆设置为True, 反向的部分则为False。
2013-10-14 03:20 上传
下载附件
(24.07 KB)
设置完成Transition后,将rifle _jump、turn_left与turning_right_45degrees分别添加到Jump、TurnLeft与TurnRight的Motion栏位内。
2013-10-14 03:20 上传
下载附件
(30.99 KB)
打开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键可进行左右的转向,按下空白键则是让角色跳跃。
2013-10-14 03:20 上传
下载附件
(177.6 KB)
2013-10-14 03:21 上传
下载附件
(182.47 KB)
动作测试没问题后,接着我们需要在角色上面增加一个瞄准点的功能,目的是让这个第三人称的角色在进行瞄准目标时,角色的上半身能够跟着做转向,那么要如何来设置呢?
新增一个名称为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里面需要对几个栏位进行设置。
2013-10-14 03:21 上传
下载附件
(50.24 KB)
将士兵模型物件里面的Spine添加到MouseAim> Spine,RightHand添加到ArmedHand的栏位,将GUI 目录下的crossAim贴图添加到Target Aim的栏位内。
2013-10-14 03:21 上传
下载附件
(53.52 KB)
设置完成后进行测试,现在角色的上半身已经可以跟随鼠标的移动做出转向。
2013-10-14 03:21 上传
下载附件
(180.12 KB)
2013-10-14 03:22 上传
下载附件
(180.24 KB)
2013-10-14 03:22 上传
下载附件
(181.52 KB)
另外我们还可以搭配KGFMapSystem来制作迷你地图,如图所示,右上方黄色的小箭头即为士兵模型在场景中的位置。
2013-10-14 03:23 上传
下载附件
(183.75 KB)
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
Original_Character_3.zip
2013-10-14 03:22 上传
点击文件名下载附件
4.63 MB, 下载次数: 761
作者:
烟雨
时间:
2013-10-14 08:43
很不错的Macanim应用
作者:
ku
时间:
2013-10-14 08:43
相当不错的教程,希望了视频教程,打上纳金水印
作者:
狂风大尉
时间:
2013-10-18 20:38
很不错的系列,支持做PDF
作者:
HIDEOKOJIMA
时间:
2013-10-18 21:10
感覺非常實用~
作者:
幸福小猪
时间:
2013-10-28 10:11
感谢楼主分享~
作者:
ZackD
时间:
2013-11-14 11:12
很受用,谢谢了
作者:
aaa120456
时间:
2013-11-19 16:36
看完了,这教程牛B级了~~~
作者:
cgjch8
时间:
2013-11-19 17:24
相当不错的教程
作者:
crystal7090
时间:
2013-11-19 22:29
感谢分享
作者:
zhangzhen551
时间:
2013-11-25 08:02
太赞啦!!!!
作者:
xiaoxue_8713
时间:
2013-12-19 17:13
这个要顶啊,谢谢楼主的教程
作者:
hariboot
时间:
2013-12-30 12:12
这个好,非常好的动画详解,感谢
作者:
titanko
时间:
2014-3-12 11:19
相当不错的教程
作者:
imwgysss
时间:
2014-3-18 13:36
非常感谢这个系列教程,前几个已经做完了。
作者:
无边际的梦
时间:
2014-3-18 13:47
最近在做3D项目,学习一下。。新的动画系统还没用过
作者:
oelongeo
时间:
2014-3-18 15:57
感谢! 这教程太棒了
作者:
darktide
时间:
2014-4-2 23:09
思路很不错
感谢分享!
作者:
kiskil
时间:
2014-5-22 17:34
感谢教程 很有价值
作者:
红眸
时间:
2014-8-17 16:09
谢谢分析
作者:
H.J.H
时间:
2014-8-18 09:58
谢谢分享。。。。
作者:
0835000
时间:
2015-11-24 10:50
顶一个,谢谢分享
作者:
yantian001
时间:
2015-11-24 12:59
很不错的Macanim应用..
作者:
qq1365449721
时间:
2016-5-19 15:02
总感觉有点意思小小瑕疵,我 瞄准扭腰的时候, 总有一点点 不合理的 抖动
作者:
NxShow
时间:
2016-10-20 19:40
感谢楼主
相当不错的教程
作者:
nomber111
时间:
2017-3-29 22:28
为何没有教材中的素材呢?没有跳跃动画等等。
欢迎光临 纳金网 (http://old.narkii.com/club/)
Powered by Discuz! X2.5