0.17 0.67
0.17 0.67
262 308
45-183
runleft 勾选 mirror
horizontal
通过在墙附近加一个cube来判断主相机是否进入切换区域。
按shift可以左右拉长timeline
通过角色控制器(charactercontrol)来控制y轴的固定值。将跳跃后的y坐标改为0.
在动画的curve里面设置关键帧来控制角色控制器的开启和关闭。
代码判断控制点的值。
private int colliderID=Animator .StringToHash ("Collider");
private CharacterController characterController;
start(){
characterController = GetComponent <CharacterController > ();}
if (anim .GetFloat (colliderID )>=0.05f){
characterController .enabled =false ;
}else
{
characterController .enabled =true ;
}
1.匹配的时间点得找到。
2.判断是否处于当前状态的代码
//判断当前是否处于跳墙状态
if (anim .GetCurrentAnimatorStateInfo (0).IsName ("Vault"))
3.menicom的match target的功能实现
anim.MatchTarget (matchTarget, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask (Vector3.one, 0), 0.38f, 0.5f);
}
控制一下最短距离和最大距离
transform.position:当前脚下的位置。
判断脚本代码如下:
bool isVault = false;
if (anim.GetFloat (speedZID) > 3) {
//发射一条射线做障碍检测
RaycastHit hit;
if (Physics.Raycast (transform.position + Vector3.up * 0.3f, transform.forward, out hit, 2)) {
if (hit.collider.tag == "Obstacle") {
isVault = true;
}
}
}
anim.SetBool (vaultID, isVault);
用一个bool值来判断是否需要翻墙
用一个默认的cube来判断面前墙体的高度,用来做不同的动作。
先将Player的tagged设置为Player
在maincamera 上面创建一个脚本用来跟随人物
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowTarget : MonoBehaviour {
//先找到Player
private Transform player;
//进行位置偏移
private Vector3 offset;
//c差值运算的平滑度
private float smoothing=3;
// Use this for initialization
void Start () {
//通过标签查找到角色组件
player = GameObject.FindGameObjectWithTag ("Player").transform;
//偏移量
offset = transform.position - player.position;
}
// Update is called once per frame
void LateUpdate () {
//将offset设置为player的局部坐标。
Vector3 targetPosition = player.position + player.TransformDirection (offset);
//进行差值运算
transform .position =Vector3 .Lerp (transform .position ,targetPosition ,Time .deltaTime *smoothing );
//视线跟随
transform.LookAt (player.position);
}
}
2Dsimple directional 不允许在一个方向上有多个动作‘
2Dfreeform directional 方向自由,每个方向能有多个动画,但是在同一个方向上只有一个参数。
2Dfreeform Cartesian 当动画在同一个方向上面,在同一方向上面能存在多个参数,通过多个方参数控制动画的多样性。
runright直接修改了自身的转向。通过X轴影响作用太小。
X轴调节方法:compute Positions->x position from->anglur (度数)
控制runleft(runright)d的两个PosX 值的脚本代码
//控制直行Z轴的值
anim .SetFloat( speedZID,Input .GetAxis ("Vertical")*4.0f);
//控制转向X轴的值
anim .SetFloat (horizontalID ,Input .GetAxis ("Horizontal")*126f);
普通动画
ugui的按钮
2D游戏的经历动画
rootmotion
人物角色
混合树(2D)的使用,加入转向,让人物在x轴上有移动。
speedx 转向速度
speedZ 移动速度
调出完美的运动点图:
compute position->Velocity XZ
混合树的使用(1D)
将idle walk run整合到一个混合数里面
* 1.如何将混合树设置为默认的输出端口
2.控制混合树的一个参数即可完成对动作的控制,但是不够严谨判断。
mirror是将动作镜像的意思。勾选即可将动作方向运动。
设置左右键按下的参数。(float类型)
切换到转向有三个参数,转到跑步有一个参数
input.GetAxis 用法(GetAxis("Mouse X"),GetAxis("Mouse Y"),GetAxis("Mouse ScrollWheel"),GetAxis("Vertical "),GetAxis("Horizontal "),
GetAxis 是个方法,需要传参数,参数为string类型,参数如下:
一:触屏类
1.Mouse X 鼠标沿着屏幕X移动时触发
2.Mouse Y 鼠标沿着屏幕Y移动时触发
3.Mouse ScrollWheel 当鼠标滚动轮滚动时
二:键盘操作类
1.Vertical 对应键盘上面的上下箭头,当按下上或下箭头时触
2.Horizontal 对应键盘上面的左右箭头,当按下左或右箭头时触发
public class Player : MonoBehaviour {
//定义一个macanime变量
public Animator anim;
//用哈希值代替字符串变量
private int speedID= Animator.StringToHash ("Speed");
private int isSpeedupID = Animator.StringToHash ("IsSpeedup");
// Use this for initialization
void Start () {
//获取状态机
anim = GetComponent <Animator >();
}
// Update is called once per frame
void Update () {
//将键盘输入的值赋给Speed
anim .SetFloat( speedID,Input .GetAxis ("Vertical"));
//用shift键是否按下来判断是否将行走状态切换到奔跑状态
if (Input.GetKeyDown (KeyCode.LeftShift)) {
anim.SetBool (isSpeedupID, true);
}
if (Input.GetKeyUp (KeyCode.LeftShift)) {
anim.SetBool (isSpeedupID, false );
}
}
}
//将Speed字符串变成哈希值保存,以后可以直接调用定义好的哈希值,这样会避免重复使用导致的一些变量名的错误。
public int SpeedId = Animator.StringToHash ("Speed")
Animator 里面的Hashtostring
;
Loop time下方属性
绿色:开始帧和结束帧非常匹配
创建状态机和脚本控制动画。
先在状态机里面设置float变量Speed,然后通过脚本里面的按键W使Speed的值产生改变,然后
1.骨骼隐射
人物模型,选择Rig里面的Humanoid,apply之后,点击configure即可进入骨骼映射界面。
2.将同类型的Avatar公用同一套已经做好的模型。
骨骼映射好了之后,会自动生成一个defaultAvatar,在目标rig下选择copy from avatar 即可。(骨骼映射不互通的模型,需自己主动)