mirror of
https://github.com/nothke/quality-control.git
synced 2024-12-22 07:47:30 +00:00
Sliding crane
This commit is contained in:
parent
87a0195f91
commit
0d1c168736
@ -66,7 +66,7 @@ Material:
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
@ -78,6 +78,6 @@ Material:
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 0.988124, g: 1, b: 0, a: 1}
|
||||
- _Color: {r: 1, g: 0.8835205, b: 0, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
|
83
Assets/Materials/box_black.mat
Normal file
83
Assets/Materials/box_black.mat
Normal file
@ -0,0 +1,83 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: box_black
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 0.061, y: 0.061}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 4e76002f02c7e8c4290fb7bf8cb0fdc1, type: 3}
|
||||
m_Scale: {x: 0.061, y: 0.061}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 0.33962262, g: 0.33962262, b: 0.33962262, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
8
Assets/Materials/box_black.mat.meta
Normal file
8
Assets/Materials/box_black.mat.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 54361f89cfee8b94d810c14a6beb11b5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
32
Assets/Scripts/SlidingCrane.cs
Normal file
32
Assets/Scripts/SlidingCrane.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using Nothke.Utils;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class SlidingCrane : MonoBehaviour
|
||||
{
|
||||
public InertialInterpolator xMotion = InertialInterpolator.Default();
|
||||
public InertialInterpolator yMotion = InertialInterpolator.Default();
|
||||
|
||||
public Transform xTransform;
|
||||
public Transform yTransform;
|
||||
|
||||
public float yRange = 10;
|
||||
public float xRange = 5;
|
||||
|
||||
void Start()
|
||||
{
|
||||
yMotion.AccelerateTo(1);
|
||||
xMotion.AccelerateTo(1);
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
xMotion.Update(Time.deltaTime);
|
||||
yMotion.Update(Time.deltaTime);
|
||||
|
||||
yTransform.localPosition = new Vector3(0, 0, yMotion.progress * yRange);
|
||||
xTransform.localPosition = new Vector3(xMotion.progress * xRange, 0, 0);
|
||||
}
|
||||
}
|
11
Assets/Scripts/SlidingCrane.cs.meta
Normal file
11
Assets/Scripts/SlidingCrane.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: da3ed29216d73fb43be6448aea116576
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/Scripts/Utils.meta
Normal file
8
Assets/Scripts/Utils.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c0aa3bf4c555da4db98db8126dbda0c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
406
Assets/Scripts/Utils/Interpolator.cs
Normal file
406
Assets/Scripts/Utils/Interpolator.cs
Normal file
@ -0,0 +1,406 @@
|
||||
///
|
||||
/// Interpolator and InertialInterpolator by Nothke
|
||||
///
|
||||
/// A utility struct for when a value needs to smoothly transition between 2 states.
|
||||
///
|
||||
/// Call Regress() to make the state advance towards 0,
|
||||
/// or Progress() to make it advance towards 1.
|
||||
/// Alternatively use Toggle().
|
||||
/// SetTo(value) will set it to a state immediately.
|
||||
///
|
||||
/// Call Update() every frame or fixed frame for the transition to progress.
|
||||
///
|
||||
/// An Interpolator is a version that transits at fixed speed.
|
||||
///
|
||||
/// An InertialInterpolator is a version that uses inertia, it will accelerate from one state,
|
||||
/// and slow down when approaching the end state.
|
||||
/// InertialInterpolator can also advance to arbitrary point with AccelerateTo(value).
|
||||
/// It can also "emergency-stop" by calling StartBraking().
|
||||
///
|
||||
/// It doesn't matter if you call the functions repeatedly or once.
|
||||
///
|
||||
/// Make sure to have a maxSpeed parameter higher than 0, otherwise they won't move.
|
||||
///
|
||||
/// To initialize the struct correctly in inspector (with maxSpeed > 0) use:
|
||||
/// public Interpolator interpolator = Interpolator.Default();
|
||||
///
|
||||
/// ============================================================================
|
||||
///
|
||||
/// MIT License
|
||||
///
|
||||
/// Copyright(c) 2021 Ivan Notaroš
|
||||
///
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in all
|
||||
/// copies or substantial portions of the Software.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
/// SOFTWARE.
|
||||
///
|
||||
/// ============================================================================
|
||||
///
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace Nothke.Utils
|
||||
{
|
||||
public enum ProgressionState
|
||||
{
|
||||
AtStart,
|
||||
Progressing,
|
||||
AtEnd,
|
||||
Regressing
|
||||
};
|
||||
|
||||
public interface IInterpolator
|
||||
{
|
||||
void Update(float dt);
|
||||
ProgressionState State { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Advance value towards 1.
|
||||
/// </summary>
|
||||
void Progress();
|
||||
/// <summary>
|
||||
/// Advance value towards 0.
|
||||
/// </summary>
|
||||
void Regress();
|
||||
|
||||
void SetTo(float value);
|
||||
|
||||
/// <summary>
|
||||
/// Toggle progression between progressing or regressing.
|
||||
/// </summary>
|
||||
void Toggle();
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public struct Interpolator : IInterpolator
|
||||
{
|
||||
public float maxSpeed;
|
||||
|
||||
[HideInInspector]
|
||||
public float progress, velocity;
|
||||
|
||||
ProgressionState state;
|
||||
|
||||
public ProgressionState State => state;
|
||||
//public bool ProgressingOrAtEnd => state == DeploymentState.Progressing || state == DeploymentState.AtEnd;
|
||||
|
||||
public static Interpolator Default()
|
||||
{
|
||||
return new Interpolator()
|
||||
{
|
||||
maxSpeed = 1
|
||||
};
|
||||
}
|
||||
|
||||
public void Progress()
|
||||
{
|
||||
velocity = maxSpeed;
|
||||
|
||||
state = ProgressionState.Progressing;
|
||||
}
|
||||
|
||||
public void Regress()
|
||||
{
|
||||
velocity = -maxSpeed;
|
||||
|
||||
state = ProgressionState.Regressing;
|
||||
}
|
||||
|
||||
public void Toggle()
|
||||
{
|
||||
if (state == ProgressionState.AtEnd || state == ProgressionState.Progressing)
|
||||
Regress();
|
||||
else
|
||||
Progress();
|
||||
}
|
||||
|
||||
public void SetTo(float value)
|
||||
{
|
||||
value = Mathf.Clamp01(value);
|
||||
|
||||
progress = value;
|
||||
velocity = 0;
|
||||
|
||||
if (value == 1)
|
||||
state = ProgressionState.AtEnd;
|
||||
else if (value == 0)
|
||||
state = ProgressionState.AtStart;
|
||||
else
|
||||
state = ProgressionState.Progressing;
|
||||
}
|
||||
|
||||
public void Update(float dt)
|
||||
{
|
||||
if (maxSpeed == 0)
|
||||
return;
|
||||
|
||||
progress += velocity * dt;
|
||||
|
||||
if (velocity < 0 && progress < 0)
|
||||
{
|
||||
progress = 0;
|
||||
|
||||
if (state == ProgressionState.Regressing)
|
||||
{
|
||||
velocity = 0;
|
||||
state = ProgressionState.AtStart;
|
||||
}
|
||||
}
|
||||
else if (velocity > 0 && progress > 1)
|
||||
{
|
||||
progress = 1;
|
||||
|
||||
if (state == ProgressionState.Progressing)
|
||||
{
|
||||
velocity = 0;
|
||||
state = ProgressionState.AtEnd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public struct InertialInterpolator : IInterpolator
|
||||
{
|
||||
public float maxSpeed;
|
||||
public float acceleration;
|
||||
public float brakingAcceleration;
|
||||
|
||||
[HideInInspector] public float progress;
|
||||
[HideInInspector] public float velocity;
|
||||
|
||||
[HideInInspector] public float accel;
|
||||
private ProgressionState state;
|
||||
[HideInInspector] public bool braking;
|
||||
|
||||
private float endTarget;
|
||||
private float beginTarget;
|
||||
|
||||
public ProgressionState State => state;
|
||||
public bool Stopped => velocity == 0;
|
||||
|
||||
public static InertialInterpolator Default()
|
||||
{
|
||||
return new InertialInterpolator()
|
||||
{
|
||||
maxSpeed = 1f,
|
||||
acceleration = 1f,
|
||||
|
||||
endTarget = 1f
|
||||
};
|
||||
}
|
||||
|
||||
public void Toggle()
|
||||
{
|
||||
if (state == ProgressionState.AtEnd || state == ProgressionState.Progressing)
|
||||
Regress();
|
||||
else
|
||||
Progress();
|
||||
}
|
||||
|
||||
private void ProgressTo(float to)
|
||||
{
|
||||
endTarget = to;
|
||||
|
||||
accel = acceleration;
|
||||
|
||||
state = ProgressionState.Progressing;
|
||||
|
||||
braking = velocity < 0;
|
||||
|
||||
if (braking)
|
||||
accel = brakingAcceleration > 0 ? brakingAcceleration : acceleration;
|
||||
}
|
||||
|
||||
public void Progress()
|
||||
{
|
||||
ProgressTo(1);
|
||||
}
|
||||
|
||||
private void RegressTo(float to)
|
||||
{
|
||||
beginTarget = to;
|
||||
|
||||
accel = -acceleration;
|
||||
|
||||
state = ProgressionState.Regressing;
|
||||
|
||||
braking = velocity > 0;
|
||||
|
||||
if (braking)
|
||||
accel = brakingAcceleration > 0 ? -brakingAcceleration : -acceleration;
|
||||
}
|
||||
|
||||
public void Regress()
|
||||
{
|
||||
RegressTo(0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the target to start accelerating to. Note, the input should always be 0-1
|
||||
/// </summary>
|
||||
/// <param name="to"></param>
|
||||
public void AccelerateTo(float to)
|
||||
{
|
||||
if (progress < to)
|
||||
ProgressTo(to);
|
||||
else
|
||||
RegressTo(to);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The interpolator will start decelerating with brakingAcceleration eventually slowly coming to a stop,
|
||||
/// overriding any progression status.
|
||||
/// </summary>
|
||||
public void StartBraking()
|
||||
{
|
||||
if (braking)
|
||||
return;
|
||||
|
||||
braking = true;
|
||||
|
||||
switch (velocity)
|
||||
{
|
||||
case > 0:
|
||||
ProgressTo(Mathf.Min(progress + StoppingDistance(velocity, -brakingAcceleration), 1));
|
||||
return;
|
||||
case < 0:
|
||||
RegressTo(Mathf.Max(progress - -StoppingDistance(velocity, brakingAcceleration), 0));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static float StoppingDistance(float curVelo, float accel)
|
||||
{
|
||||
return curVelo * curVelo / (2 * -accel);
|
||||
}
|
||||
|
||||
public void Update(float dt)
|
||||
{
|
||||
if (maxSpeed == 0)
|
||||
Debug.Log("MaxSpeed of a Deployer is 0, there will be no movement. Please set it before using");
|
||||
|
||||
// Limit velocity
|
||||
if (velocity < -maxSpeed)
|
||||
{
|
||||
accel = 0;
|
||||
velocity = -maxSpeed + Mathf.Epsilon;
|
||||
}
|
||||
else if (velocity > maxSpeed)
|
||||
{
|
||||
accel = 0;
|
||||
velocity = maxSpeed - Mathf.Epsilon;
|
||||
}
|
||||
|
||||
if (brakingAcceleration > 0 && !braking)
|
||||
{
|
||||
// TODO: Handle the case where braking force is so big that it immediately reverses the direction
|
||||
// In that case we should skip braking state entirely
|
||||
|
||||
if (velocity > 0 && state == ProgressionState.Progressing)
|
||||
{
|
||||
float stopDist = StoppingDistance(velocity, -brakingAcceleration);
|
||||
|
||||
if (progress > endTarget - stopDist)
|
||||
{
|
||||
accel = -brakingAcceleration;
|
||||
braking = true;
|
||||
}
|
||||
}
|
||||
else if (velocity < 0 && state == ProgressionState.Regressing)
|
||||
{
|
||||
float stopDist = -StoppingDistance(velocity, brakingAcceleration);
|
||||
|
||||
if (progress < beginTarget + stopDist)
|
||||
{
|
||||
accel = brakingAcceleration;
|
||||
braking = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (braking)
|
||||
{
|
||||
if (accel < 0 && velocity < 0)
|
||||
{
|
||||
if (state == ProgressionState.Progressing)
|
||||
SetTo(endTarget);
|
||||
else
|
||||
{
|
||||
braking = false;
|
||||
accel = -acceleration;
|
||||
}
|
||||
}
|
||||
else if (accel > 0 && velocity > 0)
|
||||
{
|
||||
if (state == ProgressionState.Regressing)
|
||||
SetTo(beginTarget);
|
||||
else
|
||||
{
|
||||
braking = false;
|
||||
accel = acceleration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
velocity += accel * dt;
|
||||
progress += velocity * dt;
|
||||
|
||||
// Clamp between 0-1
|
||||
if (velocity < 0 && progress < 0)
|
||||
{
|
||||
progress = 0;
|
||||
velocity = 0;
|
||||
|
||||
if (state == ProgressionState.Regressing)
|
||||
SetTo(0);
|
||||
}
|
||||
else if (velocity > 0 && progress > 1)
|
||||
{
|
||||
progress = 1;
|
||||
velocity = 0;
|
||||
|
||||
if (state == ProgressionState.Progressing)
|
||||
SetTo(1);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetTo(float value)
|
||||
{
|
||||
value = Mathf.Clamp01(value);
|
||||
progress = value;
|
||||
velocity = 0;
|
||||
accel = 0;
|
||||
braking = false;
|
||||
|
||||
if (value == 1)
|
||||
state = ProgressionState.AtEnd;
|
||||
else if (value == 0)
|
||||
state = ProgressionState.AtStart;
|
||||
else
|
||||
state = ProgressionState.Progressing;
|
||||
}
|
||||
}
|
||||
}
|
11
Assets/Scripts/Utils/Interpolator.cs.meta
Normal file
11
Assets/Scripts/Utils/Interpolator.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9eeaa9ab61b55044a81d9d7221b8a153
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Reference in New Issue
Block a user