SimpleTransient.cs
2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Knife.Portal
{
public class SimpleTransient : MonoBehaviour, IPortalTransient
{
[SerializeField] private bool useThreshold = false;
[SerializeField] private bool rigidBody = false;
[SerializeField] private TeleportOriginType teleportOriginType;
public bool UseThreshold
{
get
{
return useThreshold;
}
}
public Vector3 Position
{
get
{
switch(teleportOriginType)
{
case TeleportOriginType.TransformPivot:
return transform.position;
case TeleportOriginType.RigibodyCenterOfMass:
return body.worldCenterOfMass;
case TeleportOriginType.RendererBoundsCenter:
return attachedRenderer.bounds.center;
default:
return transform.position;
}
}
}
private Rigidbody body;
private Renderer attachedRenderer;
private void Start()
{
body = GetComponent<Rigidbody>();
attachedRenderer = GetComponentInChildren<Renderer>();
}
public void Teleport(Vector3 position, Quaternion rotation, Transform entry, Transform exit)
{
Vector3 offset = transform.position - Position;
transform.position = position - offset;
transform.rotation = rotation;
if(rigidBody)
{
var velocity = body.velocity;
var angularVelocity = body.angularVelocity;
var localVelocity1 = entry.InverseTransformVector(velocity);
localVelocity1.x *= -1;
localVelocity1.z *= -1;
var localAngularVelocity1 = entry.InverseTransformVector(angularVelocity);
var worldVelocity2 = exit.TransformVector(localVelocity1);
var worldAngularVelocity2 = exit.TransformVector(localAngularVelocity1);
body.velocity = worldVelocity2;
body.angularVelocity = worldAngularVelocity2;
}
}
public enum TeleportOriginType
{
TransformPivot,
RigibodyCenterOfMass,
RendererBoundsCenter
}
}
}