c# - 如何在更改动画师转换时让 npc 角色面向玩家缓慢旋转?

标签 c# unity3d

我在士兵动画师中有一个 Grounded 过渡,默认情况下这是从这个过渡开始的。然后我在 3 秒后执行此操作,它会在从 Grounded 到 Rifle_Aiming_Idle 的两个转换之间缓慢变化。

但是为了查看它是如何工作的以及它是否像我希望的那样工作良好,我必须关闭 FPSController Camera(FPSCamera 关闭为灰色)。因此,在运行游戏时,事件摄像机是 Main Camera 和 CM vcam1(Cinemachine 虚拟摄像机)。

但我想用这个过场动画做更多。 我希望过场动画只有在玩家 FPSController 退出门时才会开始:

此脚本附加到 FPSController:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

public class SpaceshipCutscene : MonoBehaviour
{
    public Transform player;
    public Transform npc;
    public float cutsceneDistance = 5f;
    public float speed;

    private bool moveNpc = false;

    // Use this for initialization
    void Start()
    {

    }

    private void Update()
    {
        if (moveNpc)
        {
            float travel = Mathf.Abs(speed) * Time.deltaTime;

            Vector3 direction = (player.position - npc.position).normalized;
            Quaternion lookrotation = Quaternion.LookRotation(direction);
            npc.rotation = Quaternion.Slerp(npc.rotation, lookrotation, Time.deltaTime * 5);
            Vector3 position = npc.position;
            position = Vector3.MoveTowards(position, player.position, travel);
            npc.position = position;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "Horizontal_Doors_Kit")
            moveNpc = true;
    }
}

我希望当玩家 FPSController 离开门时开始过场动画,并且在播放/执行过场动画时我希望同时让动画师让士兵面对 FPSController 缓慢旋转。

FPSController 退出门 > 士兵从地面慢慢改变到瞄准模式,士兵面向 FPSController 缓慢旋转。

我的问题是如何在 FPSController 离开门时启动电影机过场动画以及如何让士兵(npc)面向 FPSController 缓慢旋转。

我在脚本的更新中尝试的方法效果不佳。 它让 npc 移动,而不是像我想要的那样在过场动画中缓慢旋转。

Anim

也许对于旋转部分我应该使用 Cinemachine 而不是在脚本中这样做?也许我也应该在这里为旋转部分使用时间轴?

最佳答案

我需要的工作解决方案:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

public class SpaceshipCutscene : MonoBehaviour
{
    public Transform player;
    public Transform npc;
    public Camera FPSCamera;
    public Camera mainCamera;
    public Animator anim;
    public float rotationSpeed = 3f;

    private bool moveNpc = false;

    // Use this for initialization
    void Start()
    {

    }

    private void Update()
    {
        if (moveNpc)
        {
          Vector3 dir = player.position - npc.position;
        dir.y = 0; // keep the direction strictly horizontal
        Quaternion rot = Quaternion.LookRotation(dir);
        // slerp to the desired rotation over time
        npc.rotation = Quaternion.Slerp(npc.rotation, rot, rotationSpeed * Time.deltaTime);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "Horizontal_Doors_Kit")
        {
            FPSCamera.enabled = false;
            mainCamera.enabled = true;
            moveNpc = true;
            anim.SetTrigger("SoldierAimingTrigger");
        }
    }
}

关于c# - 如何在更改动画师转换时让 npc 角色面向玩家缓慢旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50930802/

相关文章:

c# - 返回列表中两个变量索引之间的元素

c# - 如何在 WPF 中将窗口设置为 ViewModel 的所有者

c# - 如何在 C# 中向 mailto 添加附件?

c# - 在 Unity 中转身时翻转敌方 Sprite

unity3d - EditorUtility.OpenFilePanel for Unity WebGL(运行时)

c# - 重新启动位置后如何阻止球体自行移动?

C# WPF从exe文件夹加载图片

c# - 在保存到数据库方法之后,存储库模式应该如何更新对象的 ID?

c# - 我的 OSDB 哈希算法有什么问题?

c# - 为什么新的实例化预制件与原始选定游戏对象的位置不同?