2015-01-06 13 views
1

В настоящее время я работаю над панелью безопасности, которая медленно истощает меньшее количество здоровья, которое у вас есть. Я следовал этому руководству, чтобы получить нужные мне сады: https://www.youtube.com/watch?v=NgftVg3idB4Извлечение количества масштабирования из Canvas Scaler (Unity)

Вкратце, он использует слой маски и отдельную зеленую полосу, чтобы указать количество здоровья. Перемещая зеленую полосу влево, она исчезает за слоем маски и, таким образом, показывает все меньше и меньше здоровья. метод для расчета своей позиции на основе количества здоровья здесь: Код (CSharp):

float maxXValue = healthTransform.position.x; 
float minXValue = healthTransform.position.x - healthTransform.rect.width; 

private void HandleHealth() 
{ 
    Stats attachedStats = attachedObject.GetComponent<Stats>(); 

    float currentXValuePlayer = MapValues(attachedStats.currentHealth, 0, attachedStats.maxHealth, minXValue, maxXValue); 
    healthTransform.position = new Vector3(currentXValuePlayer, cachedY); 
} 

private float MapValues(float x, float inMin, float inMax, float outMin, float outMax) 
{ 
    return (x - inMin) * (outMax - outMin)/(inMax - inMin) + outMin; 
} 
/* 
EXPLANATION: 
attachedStats.currentHealth is the current health the player has 
attachedStats.maxHealth is the maximum amount of health the player can have 
minXValue is the furthest left point the bar is at when health is 0 
maxXValue is the furthest right point the bar is at when health is full 
*/ 

Это настройка я использую для холста healthbar рисуется на. [​IMG]

Беда в том, (вероятно), что из-за масштабирования холста делает, healthTransform.rect.width еще возвращает исходный размер healthbar и не новый, масштабируемого размер. Итак, есть ли способ узнать, насколько сильно Canvas Scaler масштабирует вещи?

ответ

5

я задал тот же вопрос в декабре на форумах Unity:

http://forum.unity3d.com/threads/canvasscaler-current-scale.285134/

Ответ от единства был: «После того, как полотно было уменьшено, вы должны быть в состоянии только прочитать его обратно из scaleFactor на холсте, поскольку масштабирующее средство для холста просто контролирует это значение ».

Но независимо от того, насколько небольшой пользовательский интерфейс, значение scaleFactor всегда равно 1.0. Я не знаю, почему это так, и Единство больше не отвечало. Кто-нибудь еще имел возможность извлечь эту ценность?

Как обходной путь, локальный масштаб RectTransform на объекте, на котором установлен скрипт CanvasScaler, должен отражать текущий масштаб всего пользовательского интерфейса.

+1

Спасибо вам большое! Это была моя проблема, я уже задавался вопросом, что такое scaleFactor. Но, спасибо тонну, это застало меня в тупик, вы просто сделали мой день! – Lionlake

2

Существует более простой способ обработки ширины зеленой полосы, что делает его «заполненным» типом изображения. Таким образом, вам совсем не нужны маски, что значительно упрощает работу.


Создание healthbar в Unity 4.6+ с помощью заполнения

Создать объект холста, который содержит изображения, которые нужно (в данном случае, красный фон бар, бар зеленый план и план).

enter image description here

При помещении в таком порядке, самое низкое изображение будет появляться на вершине (смотри ниже).

enter image description here

Результат будет healthbar, который выглядит следующим образом:

enter image description here

Однако, теперь мы должны быть в состоянии контролировать ширину зеленой полосы на основе количества очки.Для того, чтобы сделать это, мы можем изменить компонент изображения «Green Bar»:

  • Изменить тип на «заполнено»
  • Изменить Наполните метод для «Горизонтальный»
  • Изменить Fill Origin на «лево».

enter image description here

Теперь можно регулировать ширину зеленой полосы путем изменения Заливка Сумму. (Вы можете протестировать его с помощью ползунка)

Наконец, вы должны добавить сценарий, который устанавливает ширину зеленой полосы, которые могли бы выглядеть следующим в C#:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class HealthBar : MonoBehaviour { 

    public float MaxHealth = 100; 
    private float _playerHealth; 
    private Image _greenBar 

    void Start() { 
      _playerHealth = MaxHealth; 
      _greenBar = transform.FindChild("GreenBar").GetComponent<Image>(); 
    } 

    void Update() { 

      //logic to set _playerHealth goes here 

      _greenBar.fillAmount = _playerHealth/MaxHealth; 
    } 
} 
0

сегодня я столкнулся именно с этой проблемой (через три года после того, как был задан вопрос) и обнаружил, что, используя scaleFactor на объекте Canvas как в Start(), так и в Update(), я смог получить правильный коэффициент масштабирования движений маски. Однако, похоже, что значение не надежно установлено в Awake(), что, возможно, вызвало некоторое горе.

Для дальнейшего использования вам не потребуется какое-либо обходное решение для этого, как было предложено в ответе Фермера Джо. Если когда-либо была ошибка, и я сомневаюсь, она была исправлена.

Смежные вопросы