Вопрос на логику кода, читал сегодня справки, думал над реализацией.
В общем висит у меня на камере метод, отвечающий за тряску камеры.
Хочу разобраться как лучше реализовать следующую логику:
Метод тряски могут вызывать разные игровые объекты и события (взрывы, падения, повреждение и т.п) из собственных скриптов.
Самый простой способ как я понял это отправка сообщений на активацию скрипта из других с помощью getComponent.
Появился вопрос следующий, в методе есть возможность задавать длительность тряски с помощью переменной. Как реализовать установку длительности тряски из тех скриптов которые будут вызывать этот метод?
Через getComponent смысл понятен, просто сначала посылать в скрипт значение продолжительности тряски и затем активировать его.
Рассматриваю вариант с подпиской метода на события, но мне кажется это слишком запутывает задачу (или нет - подскажите?) тогда событие, которое активирует метод должно задать ему длительность. Как это реализовать? Сориентируйте как должен выглядеть скрипт чтобы в него можно было передавать длительность (shakeOver) из других скриптов, которые вызывают событие.
Интересует изменение метода ShakeIsDo (), как его доработать? Надеюсь правильно объяснил вопрос.
Не пинайте в справки, я просто опять упускаю какую-то базовую концепцию ООП. Отправлять в метод/функцию объект для его модификации и возврата с помощью return я разобрался, а тут требуется void но с заданным параметром, которым управляют другие объекты, совершенно разного типа.
public class CameraShake : MonoBehaviour {
public Transform CameraTransform;
public bool isShake, shakeRun;
public float shakeAmount, shakeOver, shakeTime, shakeTimeStop;
public Vector3 OriginalPos,ShakePos,ShakeVector;
void Start () {
isShake = false;
shakeRun = false;
shakeAmount = 0.1f;
shakeOver = 0.1f;
}
void Update() {
if ((Input.GetKey(KeyCode.Space))) {
isShake = true;
shakeTime = 0f;
OriginalPos = CameraTransform.position;
shakeRun = true;
}
if ((Input.GetKey(KeyCode.B))) {
isShake = false;
shakeTime = 0f;
CameraTransform.position = OriginalPos;
}
if (shakeRun) ShakeIsDo();
}
public void ShakeIsDo ()
{
ShakePos = CameraTransform.position;
ShakeVector = Random.insideUnitSphere * shakeAmount;
ShakeVector = new Vector3(0f,ShakeVector.y,0f);
CameraTransform.position = new Vector3(ShakePos.x,ShakePos.y+ShakeVector.y,ShakePos.z);
if (((ShakePos.y-OriginalPos.y)>shakeOver)||((ShakePos.y-OriginalPos.y)<-shakeOver)) CameraTransform.position = new Vector3(ShakePos.x,OriginalPos.y,ShakePos.z);
shakeTime += Time.deltaTime;
if (shakeTime >= shakeOver) shakeRun = false;
}
}
в коде есть дублирующие переменные isShake и ShakeRun не обращайте внимание, вырезал части - немного другой подход был сначала.