Member 13745684 Ответов: 1

Как я могу вызвать событие, чтобы заставить поплавок прыгать на увеличенную сумму?


у меня есть несколько вопросов по кодированию на C#, я просто буду задавать их по одному, чтобы это не было слишком длинным.

Мне бы хотелось, когда игрок идет в поле зрения противника, враг бросается на игрока и затем исчезает, вызывая повышение частоты сердечных сокращений на 20 ударов в минуту.

Я думаю, что события, PlayerInViewEvent и RateIncreaseEvent-это то, что будет работать для этого. но я не знаю, как заставить все это работать в коде, и я не знаю, являются ли они даже лучшим способом сделать это. Могу ли я, пожалуйста, получить некоторую помощь в кодировании.

вот код, который у меня есть до сих пор. что в основном просто повышает частоту сердечных сокращений игрока, когда он приближается к врагу, и снижает ее, когда они удаляются от врага.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HeartRate : MonoBehaviour {

    public GameObject Player;
    public GameObject Enemy;
    float heartRateBase = 80; // 80 BPM
   public float heartRate = 100;

    float safeDistance = 5; // distance away form the enemy where heart rate goes down

    float relaxRate = 0.005f; //  how fast the player recovers
    float stressRate = 0.05f;// The closer the plauer is to the enemy the more it will increase

    void FixedUpdate()
    {
        // Find distance from enemy
        float dist = Vector3.Distance (Player.transform.position, Enemy.transform.position);

        // Check to see if player is safe
        if (dist > safeDistance)
        {
            // Decrease player heart Rate
            if (heartRate > heartRateBase)
                heartRate -= relaxRate;
        }
        else
        {
            // Increase the players heart rate depending on how close they are
            float rate = 1 - dist / safeDistance;
            heartRate += stressRate * rate;
        }

    }
}


Что я уже пробовал:

private int JumpRate;

public event System.EventHandler ChangeHeartRate;

protected virtual void OnHeartChanged()
{ 
     if (ChangeHeartRate!= null) ChangeHeartRate(this,EventArgs.Empty); 
}

public int heartT
{
    get
    {
         return JumpRate;
    }

    set
    {
         //#3
         JumpRate=value;
         OnHeartChanged();
    }
 }

1 Ответов

Рейтинг:
12

#realJSOP

Во-первых, я бы, вероятно, изменил метод heartT.set на этот. Это предотвратит вас от случайного обращения с частотой сердечных сокращений, которая не меняется:

set 
{
    // Only change the field if the value has actually changed. If you 
    // want to only change the heart rate if the change is greater or 
    // less than a specific value, change the if statement accordingy
    if (value != JumpRate)
    {
        JumpRate = value;
        NotifyPropertyChanged(); // see next comment below.
    }
}


Во-вторых, я бы извлек свой объект из INotifyPropertyChanged чтобы я мог реагировать на изменения в свойствах. Это избавит вас от необходимости писать пользовательские обработчики событий. Я не думаю, что вам нужно кодировать для WPF, чтобы воспользоваться преимуществами уведомляемых объектов.


Member 13745684

хорошо, мне нравится изменение в первой части вашего ответа, однако я не знаю, как использовать "INotifyPropertyChanged" - как я должен использовать его в коде, я вижу, что вы вставили его туда, где он должен быть, но как мне заставить его работать правильно?

#realJSOP

Google-ваш друг.

#realJSOP

Если вы не можете спорить с google, ваша карьера разработчика разрушена. Я гуглю по меньшей мере дюжину раз в день, и я был программистом почти 40 лет. Я молю Бога, чтобы у меня был google в качестве ресурса, когда я только начинал. Но мы этого не сделали, и нам пришлось пройти через все наши вопросы, надеясь найти ответ самостоятельно или в печатной книге. У вас, новеньких, все гораздо проще, на все лады воображения.

Когда я гуглил "inotifypropertychanged", самая первая страница результатов была заполнена ссылками, которые показывают, как это сделать.

(Использование google-это почти такой же важный навык, как и умение пользоваться отладчиком.)

Member 13745684

...спасибо