[Решено] Отнятие жизни при падении с высоты
AIDEN Дата: Ср, 26 Июн 2013, 16:51 | Сообщение # 21
Сообщений: 59
Награды:
0
Репутация:
56
Статус: Offline
Я уже гдето отвечал на такой вопрос? Да ладно, держы : Скрипт C# - PlayerFallDamage : Код
using UnityEngine ; using System . Collections ; using System . Collections . Generic ; public class PlayerFallDamage : MonoBehaviour { RaycastHit uHit ; CharacterController uCharControler ; public float uHealth = 100.0f ; public float fallDamageCoef = 1.0f ; float lastVelocity = 0.0f ; float velocityLimit = - 15.0f ; private bool uGUIEnable = false ; void fDEBUG (){ GUI . Label ( new Rect ( 1 , 1 , 100 , 100 ), "Health: " + uHealth ); } void fGroundet () { //Функция расчета урона от падения if ( uCharControler . isGrounded ) { if ( lastVelocity < velocityLimit ) { float damage = - lastVelocity * fallDamageCoef ; Damage ( damage ); lastVelocity = 0.0f ; }; } else lastVelocity = uCharControler . velocity . y ; } float lastShot = 0 ; int i = 1 ; void Damage ( float damage ) { uHealth -= damage ; } Vector2 VC = Vector2 . zero ; void DrawGUI () { GUI . EndScrollView (); } void OnGUI () { #region DrawLabel Ray uCastRay = new Ray ( Camera . mainCamera . transform . TransformPoint ( 0 , 0 , 0.5f ), Camera . mainCamera . transform . TransformDirection ( new Vector3 ( 0 , 0 , 5 ))); #endregion DrawLabel fDEBUG (); if ( uGUIEnable == true ) DrawGUI (); } void Start () { uCharControler = ( CharacterController ) GetComponent ( "CharacterController" ); } void Update () { fGroundet (); } }
Моя игра - Collect Fruit
Сообщение Я уже гдето отвечал на такой вопрос? Да ладно, держы : Скрипт C# - PlayerFallDamage : Код
using UnityEngine ; using System . Collections ; using System . Collections . Generic ; public class PlayerFallDamage : MonoBehaviour { RaycastHit uHit ; CharacterController uCharControler ; public float uHealth = 100.0f ; public float fallDamageCoef = 1.0f ; float lastVelocity = 0.0f ; float velocityLimit = - 15.0f ; private bool uGUIEnable = false ; void fDEBUG (){ GUI . Label ( new Rect ( 1 , 1 , 100 , 100 ), "Health: " + uHealth ); } void fGroundet () { //Функция расчета урона от падения if ( uCharControler . isGrounded ) { if ( lastVelocity < velocityLimit ) { float damage = - lastVelocity * fallDamageCoef ; Damage ( damage ); lastVelocity = 0.0f ; }; } else lastVelocity = uCharControler . velocity . y ; } float lastShot = 0 ; int i = 1 ; void Damage ( float damage ) { uHealth -= damage ; } Vector2 VC = Vector2 . zero ; void DrawGUI () { GUI . EndScrollView (); } void OnGUI () { #region DrawLabel Ray uCastRay = new Ray ( Camera . mainCamera . transform . TransformPoint ( 0 , 0 , 0.5f ), Camera . mainCamera . transform . TransformDirection ( new Vector3 ( 0 , 0 , 5 ))); #endregion DrawLabel fDEBUG (); if ( uGUIEnable == true ) DrawGUI (); } void Start () { uCharControler = ( CharacterController ) GetComponent ( "CharacterController" ); } void Update () { fGroundet (); } }
Автор - AIDEN Дата добавления - 26 Июн 2013 в 16:51
VolkOrievith Дата: Пн, 01 Июл 2013, 22:18 | Сообщение # 22
Сообщений: 222
Награды:
0
Репутация:
53
Статус: Offline
Здравствуйте дорогие однофорумчане! Давно не виделись. Извините, что не читал всё выше сказанное, но вот мой вариант (для CharacterController'a): Код
var HitPoints = 100.0 ; // Жизни var DamageFromFall = 0.0 ; // урон от падения (не надо устанавливать) var DamageFromFallMyltiply = 0.0 ; // множитель урона от падения (чем больше число, тем больше урон) var MinDamageFallHeight = 0.0 ; // если расстояние до земли больше этого числа, то урон больше ноля (я устанавливал 20) var MinDifferenceFallPosition = 0.0 ; // если расстояние до земли больше MinDamageFallHeight, то начинается отсчет разници transform.position.y между началом падения и приземлением, и если разница больше этого числа, то урон больше ноля. private var StartFallPosition = 0.0 ; var GrHit : RaycastHit ; function Update () { if ( Physics . Raycast ( transform . position + Vector3 ( 0 , 0.5 , 0 ), - transform . up , GrHit )){ if ( GrHit . distance > 2.2 ){ IsGrounded = false ; } else { IsGrounded = true ; } if ( GrHit . distance >= MinDamageFallHeight ){ if ( DamageFromFall < GrHit . distance * DamageFromFallMyltiply ) DamageFromFall = GrHit . distance * DamageFromFallMyltiply ; if ( StartFallPosition < transform . position . y ) StartFallPosition = transform . position . y ; } else if ( DamageFromFall > 0.0 && IsGrounded ){ if ( MinDifferenceFallPosition <= StartFallPosition - transform . position . y ) HitPoints -= DamageFromFall ; DamageFromFall = 0.0 ; } } }
Сообщение Здравствуйте дорогие однофорумчане! Давно не виделись. Извините, что не читал всё выше сказанное, но вот мой вариант (для CharacterController'a): Код
var HitPoints = 100.0 ; // Жизни var DamageFromFall = 0.0 ; // урон от падения (не надо устанавливать) var DamageFromFallMyltiply = 0.0 ; // множитель урона от падения (чем больше число, тем больше урон) var MinDamageFallHeight = 0.0 ; // если расстояние до земли больше этого числа, то урон больше ноля (я устанавливал 20) var MinDifferenceFallPosition = 0.0 ; // если расстояние до земли больше MinDamageFallHeight, то начинается отсчет разници transform.position.y между началом падения и приземлением, и если разница больше этого числа, то урон больше ноля. private var StartFallPosition = 0.0 ; var GrHit : RaycastHit ; function Update () { if ( Physics . Raycast ( transform . position + Vector3 ( 0 , 0.5 , 0 ), - transform . up , GrHit )){ if ( GrHit . distance > 2.2 ){ IsGrounded = false ; } else { IsGrounded = true ; } if ( GrHit . distance >= MinDamageFallHeight ){ if ( DamageFromFall < GrHit . distance * DamageFromFallMyltiply ) DamageFromFall = GrHit . distance * DamageFromFallMyltiply ; if ( StartFallPosition < transform . position . y ) StartFallPosition = transform . position . y ; } else if ( DamageFromFall > 0.0 && IsGrounded ){ if ( MinDifferenceFallPosition <= StartFallPosition - transform . position . y ) HitPoints -= DamageFromFall ; DamageFromFall = 0.0 ; } } }
Автор - VolkOrievith Дата добавления - 01 Июл 2013 в 22:18
CoMMoN Дата: Сб, 14 Сен 2013, 14:55 | Сообщение # 23
Сообщений: 11
Награды:
0
Репутация:
0
Статус: Offline
VolkOrievith , а как это на C# будет смотреться? чота я уже голову сломал переводя на сишарп
Сообщение VolkOrievith , а как это на C# будет смотреться? чота я уже голову сломал переводя на сишарпАвтор - CoMMoN Дата добавления - 14 Сен 2013 в 14:55
Profik Дата: Чт, 24 Июл 2014, 18:12 | Сообщение # 24
Сообщений: 3
Награды:
0
Репутация:
0
Статус: Offline
Привет друзья я тоже задался таким вопросом и написал скрипт Код
var MinDamageDistance = 10 ; var DamageCoef = 1 ; var HealthTXT : GUIText ; var Health = 100 ; private var CharControler : CharacterController ; private var Damage = 0.0 ; private var PosY : float ; private var RazY : float ; private var GrHit : RaycastHit ; private var IsGrounded = false ; private var CanWrite = true ; function Update () { if ( Physics . Raycast ( transform . position + Vector3 ( 0 , 0.5 , 0 ), - transform . up , GrHit )){ if ( GrHit . distance > 2.2 ){ IsGrounded = false ; } else { IsGrounded = true ; } } FallDamage (); HealthTXT . text = Health . ToString (); } function FallDamage () { if (! IsGrounded ) { if ( CanWrite ) { PosY = transform . position . y ; CanWrite = false ; } RazY = PosY - transform . position . y ; if ( RazY > MinDamageDistance ) { Damage = ( RazY - MinDamageDistance ) * ( DamageCoef + 1 ); } } else if ( IsGrounded ) { CanWrite = true ; if ( Damage > 0 ) { PosY = transform . position . y ; Debug . Log ( Damage ); Health -= Damage ; Damage = 0 ; } } }
<iframe src="https://www.indiegogo.com/project/black-skull-pirate-adventure-and-action-game/embedded/8232738" width="222px" height="445px" frameborder="0" scrolling="no"></iframe>
Сообщение Привет друзья я тоже задался таким вопросом и написал скрипт Код
var MinDamageDistance = 10 ; var DamageCoef = 1 ; var HealthTXT : GUIText ; var Health = 100 ; private var CharControler : CharacterController ; private var Damage = 0.0 ; private var PosY : float ; private var RazY : float ; private var GrHit : RaycastHit ; private var IsGrounded = false ; private var CanWrite = true ; function Update () { if ( Physics . Raycast ( transform . position + Vector3 ( 0 , 0.5 , 0 ), - transform . up , GrHit )){ if ( GrHit . distance > 2.2 ){ IsGrounded = false ; } else { IsGrounded = true ; } } FallDamage (); HealthTXT . text = Health . ToString (); } function FallDamage () { if (! IsGrounded ) { if ( CanWrite ) { PosY = transform . position . y ; CanWrite = false ; } RazY = PosY - transform . position . y ; if ( RazY > MinDamageDistance ) { Damage = ( RazY - MinDamageDistance ) * ( DamageCoef + 1 ); } } else if ( IsGrounded ) { CanWrite = true ; if ( Damage > 0 ) { PosY = transform . position . y ; Debug . Log ( Damage ); Health -= Damage ; Damage = 0 ; } } }
Автор - Profik Дата добавления - 24 Июл 2014 в 18:12
baha Дата: Пт, 25 Июл 2014, 10:52 | Сообщение # 25
Сообщений: 37
Награды:
0
Репутация:
1
Статус: Offline
а если проверять время проведенное в воздухе? Я лично так сделал.
Сообщение а если проверять время проведенное в воздухе? Я лично так сделал. Автор - baha Дата добавления - 25 Июл 2014 в 10:52
Profik Дата: Пт, 25 Июл 2014, 11:54 | Сообщение # 26
Сообщений: 3
Награды:
0
Репутация:
0
Статус: Offline
Цитата baha (
)
а если проверять время проведенное в воздухе?
Ну вариант не очень, ведь перс может иметь разный вес и поэтому разное время будет лететь, лучше отсчитывать кол-во координат, которые он пролетел, как у меня.
<iframe src="https://www.indiegogo.com/project/black-skull-pirate-adventure-and-action-game/embedded/8232738" width="222px" height="445px" frameborder="0" scrolling="no"></iframe>
Сообщение Цитата baha (
)
а если проверять время проведенное в воздухе?
Ну вариант не очень, ведь перс может иметь разный вес и поэтому разное время будет лететь, лучше отсчитывать кол-во координат, которые он пролетел, как у меня.Автор - Profik Дата добавления - 25 Июл 2014 в 11:54
commandoby Дата: Пт, 25 Июл 2014, 12:49 | Сообщение # 27
Unity 3D Free
Сообщений: 836
Награды:
3
Репутация:
211
Статус: Offline
Я в своей игре (White track) отсчитываю изменение в скорости. Только в моей игре игрок не может умереть от удара, поэтому я отсчитываю скорость по всем координатам, и при сильном ударе об землю или стену камера начинает трястись и темнеть, постепенно угасая.
Блог.
Сообщение Я в своей игре (White track) отсчитываю изменение в скорости. Только в моей игре игрок не может умереть от удара, поэтому я отсчитываю скорость по всем координатам, и при сильном ударе об землю или стену камера начинает трястись и темнеть, постепенно угасая. Автор - commandoby Дата добавления - 25 Июл 2014 в 12:49