正在学习unity,记录一下遇到的问题以后忘了再翻来看,自己学习记录。
效果如下
让AI写了个代码,用了插件让开门动作平缓一些。
双开门,我是在门框(也可以新建一个GameObject)设置了一个Box Collider,用来整体控制开关门效果将左侧门和右侧门放在下面作为子物体;将代码挂载在门框(GameObject)上,将左右门拖拽给面板。
注意点:1、模型的Transform-Rotation要设置为0
2、我烘焙了贴图,模型勾选了Static(Inspector面板顶部),这就导致我点击模型后没有任何反应,我找了好久的问题(/(ㄒoㄒ)/~~),取消勾选Static就可以了。
using DG.Tweening;
using UnityEngine;
public class DoubleDoorController : MonoBehaviour
{
public Transform leftDoor;
public Transform rightDoor;
public float openAngle = 90f; // 开门角度
public float duration = 1f; // 动画时长
public Ease easeType = Ease.OutQuad; // 缓冲类型
private bool isDoorOpen = false;
private Vector3 leftDoorClosedRotation; // 左门关闭时的角度
private Vector3 rightDoorClosedRotation; // 右门关闭时的角度
private Sequence doorSequence; // 动画序列
void Start()
{
// 记录初始角度(假设门的关闭状态为初始角度)
leftDoorClosedRotation = leftDoor.localEulerAngles;
rightDoorClosedRotation = rightDoor.localEulerAngles;
}
void OnMouseDown()
{
ToggleDoors();
}
void ToggleDoors()
{
// 如果动画正在播放,强制终止
if (doorSequence != null && doorSequence.IsActive())
doorSequence.Kill();
// 计算目标角度
Vector3 leftTarget = isDoorOpen ?
leftDoorClosedRotation :
new Vector3(0f, -(leftDoorClosedRotation.y - openAngle), 0f);
Vector3 rightTarget = isDoorOpen ?
rightDoorClosedRotation :
new Vector3(0f, -(rightDoorClosedRotation.y + openAngle), 0f);
// 创建动画序列
doorSequence = DOTween.Sequence();
doorSequence.Join(leftDoor.DOLocalRotate(leftTarget, duration).SetEase(easeType));
doorSequence.Join(rightDoor.DOLocalRotate(rightTarget, duration).SetEase(easeType));
// 切换门的状态
isDoorOpen = !isDoorOpen;
}
}