第三人称——骑马系统以及交互动画

第三人称——骑马系统以及交互动画

一言准备中...

骑马系统

人物在马上的脚本

using MalbersAnimations; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ThirdPersonRidingHorse : MonoBehaviour { [Header("骑马参数")] public GameObject horse; public bool isOnHorse; //void OnInteract() //{ // var thirdPersonMove = GetComponent<ThirdPersonMove>(); // thirdPersonMove.enabled = false; // var pos = horse.transform.Find("Pos_UpToHorse"); //} CharacterController characterController; Animator animator; ThirdPersonMove thirdPersonMove; private void Awake() { characterController = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); thirdPersonMove = GetComponent<ThirdPersonMove>(); } private void Update() { if (isOnHorse) { var axisX = Input.GetAxis("Horizontal"); var axisY = Input.GetAxis("Vertical"); animator.SetFloat("AxisX", axisX); animator.SetFloat("AxisY", axisY); } Ride(); } void Ride() { //上马 if (!isOnHorse) { if (Input.GetKeyDown(KeyCode.F)) { isOnHorse = true; transform.rotation = horse.transform.rotation; transform.position = horse.transform.position; //将角色放到马上 var playerPoint = horse.transform.Find("PlayerPoint"); transform.SetParent(playerPoint); transform.localPosition = Vector3.zero; //在马上禁用角色的characterController和move characterController.enabled = false; thirdPersonMove.enabled = false; //开启马的输入控制脚本 horse.GetComponent<MalbersInput>().enabled = true; //切换马上动作状态,即权重从0到1 animator.SetLayerWeight(2, 1f); } } //下马 else { if (Input.GetKeyDown(KeyCode.F)) { isOnHorse = false; if (horse != null) { //删除马之前设置角色位置 transform.SetParent(null); transform.position = horse.transform.position; transform.rotation = horse.transform.rotation; //下马后恢复角色的characterController和move characterController.enabled = true; thirdPersonMove.enabled = true; //关闭马的输入控制脚本 horse.GetComponent<MalbersInput>().enabled = false; //关闭马上动作层 animator.SetLayerWeight(2, 0f); } } } } } 

马的部分——插件:Horse Animset Pro Riding System 4.0.1.unitypackage

第三人称——骑马系统以及交互动画

状态机设置

先学习怎么做场景交互

以常见的开宝箱交互为例:

1)先建一个可开盖宝箱的模型

第三人称——骑马系统以及交互动画

第三人称——骑马系统以及交互动画

2)在Box的子级中建立一个空的GameObject,当作角色开始播放交互动画的位置

第三人称——骑马系统以及交互动画

3)在Box的animation窗口中建立动画——Box的开盖动画

第三人称——骑马系统以及交互动画

第三人称——骑马系统以及交互动画

4)这里需要把开盖动画的Loop Time给取消勾选

第三人称——骑马系统以及交互动画

5)来到Timeline窗口,新建一个Box的Timeline,把Box的开盖动画和角色交互的动画拖进去

第三人称——骑马系统以及交互动画

注:角色动画是mixamo里找的

第三人称——骑马系统以及交互动画

角色的Track在k帧的时候选上 角色的animator,在k完之后就记得要取消勾选animator

第三人称——骑马系统以及交互动画

也要记得修改该动画的名字,后面脚本会用到

第三人称——骑马系统以及交互动画

为了保证开盖动画在人物动画播完后仍然还在播,点开开盖动画的Animation Track,设置为continue

第三人称——骑马系统以及交互动画

6)把人物移到和PlayerStandPosition同一个位置,追求完美可以k一下开盖动画和角色动画的匹配度,并加上过渡动画(这里我就懒得弄了,因为只是学习怎么做动画交互系统)

7)为Box加上Tag-Box

第三人称——骑马系统以及交互动画

8)为Box加上Trigger碰撞体

第三人称——骑马系统以及交互动画

9)取消勾选Play On Awake,不然还没触发就开始播动画了

第三人称——骑马系统以及交互动画

第三人称——骑马系统以及交互动画

OK,交互动画匹配好了,下面写脚本控制角色到达一个Box周围的Trigger碰撞体区域,按下交互的Input按键才触发动画

脚本逻辑:

在碰撞体区域按下按键->开始找tag为Box的GameObject,找到的对象就是Box->在Box的子级中找名为PlayerStandPosition的对象->更新角色位置、朝向->在Box的playerableAsset中找到PlayerTrack,播放相应的BoxTimeline

脚本如下:

PlayerOpenBox.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.InputSystem; public class PlayerOpenBox : MonoBehaviour { bool isPlaying = false; IEnumerator OnInteract() { if (list.Count > 0 && isPlaying == false) { isPlaying = true; var thirdPersonMove = GetComponent<ThirdPersonMove>(); thirdPersonMove.enabled = false; var thirdPersonJump = GetComponent<ThirdPersonJump>(); thirdPersonJump.enabled = false; var thirdPersonRoll = GetComponent<ThirdPersonRoll>(); thirdPersonRoll.enabled = false; var director = list[0]; list.RemoveAt(0); var pos = director.transform.Find("PlayerStandPosition"); transform.position = pos.position; //Debug.Log(pos.position); transform.rotation = pos.rotation; var animator = GetComponent<Animator>(); foreach (var output in director.playableAsset.outputs) { if (output.streamName == "PlayerTrack") { director.SetGenericBinding(output.sourceObject, animator); break; } } director.Play(); while(director.state == PlayState.Playing) { yield return null; } thirdPersonMove.enabled = true; thirdPersonJump.enabled = true; thirdPersonRoll.enabled = true; isPlaying = false; } } List<PlayableDirector> list = new List<PlayableDirector>(); private void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "Box") { var director = other.gameObject.GetComponent<PlayableDirector>(); if (director != null && !list.Contains(director)) { list.Add(director); } //Debug.Log(transform.position); } } private void OnTriggerExit(Collider other) { if (other.gameObject.tag == "Box") { var director = other.gameObject.GetComponent<PlayableDirector>(); if (director != null && list.Contains(director)) { list.Remove(director); } } } } 

脚本挂在角色身上

效果如下:

第三人称——骑马系统以及交互动画

上下马交互系统

  • 本文作者:WAP站长网
  • 本文链接: https://wapzz.net/post-27292.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
本站部分内容来源于网络转载,仅供学习交流使用。如涉及版权问题,请及时联系我们,我们将第一时间处理。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
2.7W+
9
1
2
WAP站长官方

还在为调试提示词头疼?一个案例教你轻松上手!

上一篇

测试者家园

下一篇
评论区
内容为空

这一切,似未曾拥有

  • 复制图片
按住ctrl可打开默认菜单