开发我的独立游戏时,需要主角进入触发器被瞬移走,就写了这个脚本。
相对位移:
Vector3 MOVector3 = moveObject.transform.localPosition;
moveObject.transform.localPosition = new Vector3(MOVector3.x + x, MOVector3.y + y, MOVector3.z + z);
绝对位移:
moveObject.transform.localPosition = new Vector3(x, y, z);
再加亿点修饰的完整代码:
using UnityEngine;
/// <summary>
/// 挂在触发器下
/// 进入/离开触发器时移动物体
/// </summary>
public class TriggerMove : MonoBehaviour
{
[Header("要移动的物体")]
[SerializeField] private GameObject moveObject;
[Header("相对位移还是绝对位移?")]
[SerializeField] private MoveType moveType;
[Header("位移:")]
[SerializeField] private float x;
[SerializeField] private float y;
[SerializeField] private float z;
[Header("只能触发一次?")]
[SerializeField] private bool onlyOnce;
[Header("控制触发类型")]
[Tooltip("anyState:进入/离开触发器都可以触发\ntriggerEnter:进入触发器时触发\ntriggerExit:离开触发器时触发")]
[SerializeField] private TriggerType triggerType = TriggerType.triggerEnter;
private bool once = true; //只能触发一次
private void OnTriggerEnter(Collider other)
{
if ((once || !onlyOnce) && (triggerType == TriggerType.triggerEnter || triggerType == TriggerType.anyState))
{
MoveAndCounter();
}
}
private void OnTriggerExit(Collider other)
{
if ((once || !onlyOnce) && (triggerType == TriggerType.triggerExit || triggerType == TriggerType.anyState))
{
MoveAndCounter();
}
}
private void MoveAndCounter()
{
switch (moveType)
{
case MoveType.localMove:
LocalMove();
break;
case MoveType.globalMove:
GloballMove();
break;
}
once = false; //只能触发一次
}
/// <summary>
/// 相对位移
/// </summary>
private void LocalMove()
{
Vector3 MOVector3 = moveObject.transform.localPosition;
moveObject.transform.localPosition = new Vector3(MOVector3.x + x, MOVector3.y + y, MOVector3.z + z); //物体位移
}
/// <summary>
/// 绝对位移
/// </summary>
private void GloballMove()
{
moveObject.transform.localPosition = new Vector3(x, y, z); //物体位移
}
}
/// <summary>
/// 触发器触发条件类型
/// </summary>
public enum TriggerType
{
anyState,
triggerEnter,
triggerExit
}
/// <summary>
/// 位移类型
/// </summary>
public enum MoveType
{
localMove,
globalMove
}
效果图:
看都看了,点个赞呗~