Показать сообщение отдельно
Старый 26.03.2015, 00:20   #111
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Вопрос на логику кода, читал сегодня справки, думал над реализацией.
В общем висит у меня на камере метод, отвечающий за тряску камеры.

Хочу разобраться как лучше реализовать следующую логику:
Метод тряски могут вызывать разные игровые объекты и события (взрывы, падения, повреждение и т.п) из собственных скриптов.
Самый простой способ как я понял это отправка сообщений на активацию скрипта из других с помощью getComponent.

Появился вопрос следующий, в методе есть возможность задавать длительность тряски с помощью переменной. Как реализовать установку длительности тряски из тех скриптов которые будут вызывать этот метод?

Через getComponent смысл понятен, просто сначала посылать в скрипт значение продолжительности тряски и затем активировать его.

Рассматриваю вариант с подпиской метода на события, но мне кажется это слишком запутывает задачу (или нет - подскажите?) тогда событие, которое активирует метод должно задать ему длительность. Как это реализовать? Сориентируйте как должен выглядеть скрипт чтобы в него можно было передавать длительность (shakeOver) из других скриптов, которые вызывают событие.

Интересует изменение метода ShakeIsDo (), как его доработать? Надеюсь правильно объяснил вопрос.
Не пинайте в справки, я просто опять упускаю какую-то базовую концепцию ООП. Отправлять в метод/функцию объект для его модификации и возврата с помощью return я разобрался, а тут требуется void но с заданным параметром, которым управляют другие объекты, совершенно разного типа.

public class CameraShake MonoBehaviour {
    
public 
Transform CameraTransform;
public 
bool isShakeshakeRun;
public 
float shakeAmountshakeOvershakeTimeshakeTimeStop;
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 (
shakeRunShakeIsDo();     
        
}
    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 >= shakeOvershakeRun false;
        }

в коде есть дублирующие переменные isShake и ShakeRun не обращайте внимание, вырезал части - немного другой подход был сначала.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием