А если опечатался и перепутал местами тэг и индекс? А если не поставил закрывающую кавычку, ты сделал проверку формата? А если две кавычки случайно нажал?
А если многострочный текст?
И это ещё прееводчик должен помнить, какой из "столбцов" нужно редактировать
А где в этом формате место для комментариев с пояснением контекста?
Про блокнот сказал, потому что он, как и любой другой тектовый редактор, умеет подсвечивать синтаксис json и ещё лучше умеет подсвечивать XML. И сразу на месте подсветит ошибки синтаксиса хоть какие-то.
Просто формат ключ:строка удобен только в простейших случаях, когда ресурсов мало и их не редактируют. Либо есть редактор этих ресурсов, защищающий от ошибок. Даже в CSV формате будет намного удобнее и проще, чем изобретать свой "простой формат".
using UnityEngine;
public class PlayerController : MonoBehaviour {
public Camera Camera;
public float Sensitivity = 150f;
public float Speed = 5f;
public float StepHeight = 0.2f;
public float StepAngle = 20f;
public float Radius = 0.5f;
public float Height = 1f;
public float Thickness = 0.02f;
public bool Grounded = false;
public Vector3 Gravity = new Vector3(0f, -9.8f, 0f);
public float X;
public float Y;
private const uint MaxCollisionSteps = 8;
private void Update() {
var h = Input.GetAxisRaw("Horizontal");
var v = Input.GetAxisRaw("Vertical");
var x = Input.GetAxisRaw("Mouse X");
var y = Input.GetAxisRaw("Mouse Y");
X += x * Sensitivity * Time.deltaTime;
Y += y * Sensitivity * Time.deltaTime;
Y = Mathf.Clamp(Y, -89f, 89f);
Camera.transform.rotation = Quaternion.Euler(new Vector3(-Y, X, 0));
var pos = transform.position;
var forward = Camera.transform.forward;
var right = Camera.transform.right;
var dir = forward * v + right * h;
dir.y = 0f;
dir.Normalize();
var velocity = dir * Speed * Time.deltaTime;
pos = Movement(pos, velocity);
pos = ApplyGravity(pos);
transform.position = pos;
}
private Vector3 ApplyGravity(Vector3 pos) {
var gravity = Gravity * Time.deltaTime;
var collide = Physics.CapsuleCast(pos,
pos + new Vector3(0, Height, 0),
Radius,
gravity,
out var hit,
gravity.magnitude);
if(collide) {
Debug.DrawRay(hit.point, hit.normal * 2f, Color.green);
var d = hit.point - pos;
var l = d.magnitude - Radius - Thickness;
pos += gravity.normalized * l;
Grounded = true;
} else {
pos += gravity;
Grounded = false;
}
return pos;
}
private Vector3 Movement(Vector3 pos, Vector3 velocity) {
var dir = velocity.normalized;
var distanceLeft = velocity.magnitude;
for(var i = 0; i < MaxCollisionSteps; ++i) {
var collide = Physics.CapsuleCast(pos,
pos + new Vector3(0, Height, 0),
Radius,
velocity,
out var hit,
distanceLeft);
if(collide) {
Debug.DrawRay(hit.point, hit.normal * 2f, Color.red);
var d = hit.point - pos;
var l = d.magnitude - Radius - Thickness;
distanceLeft -= l;
var angle = Vector3.Angle(Vector3.up, hit.normal);
if(angle >= StepAngle) {
var stepUp = pos + new Vector3(0, StepHeight, 0);
var stepCollide = Physics.CapsuleCast(stepUp,
stepUp + new Vector3(0, Height, 0),
Radius,
dir,
out hit,
distanceLeft);
Debug.DrawRay(stepUp, dir * 2f, Color.yellow);
if(!stepCollide) {
pos = stepUp + dir * distanceLeft;
distanceLeft = 0;
break;
}
}
dir = Vector3.ProjectOnPlane(dir, hit.normal).normalized;
pos += dir * l;
if(distanceLeft <= Thickness) {
break;
}
} else {
pos += dir * distanceLeft;
break;
}
}
return pos;
}
}
public enum ItemType : byte {
Clothes,
Weapon
}
[CreateAssetMenu(fileName = "Item Config", menuName = "Configs/Item")]
public class ItemConfig : ScriptableObject {
public ItemType Type;
public float Damage;
public float SwingSpeed;
public int Armor;
public float Weight;
}
[CustomEditor(typeof(ItemConfig))]
public class ItemConfigEditor : Editor {
public override void OnInspectorGUI() {
var typeProperty = serializedObject.FindProperty("Type");
EditorGUILayout.PropertyField(typeProperty);
var type = (ItemType)typeProperty.enumValueIndex;
switch(type) {
case ItemType.Clothes : {
DrawProperty("Armor");
DrawProperty("Weight");
} break;
case ItemType.Weapon : {
DrawProperty("Damage");
DrawProperty("SwingSpeed");
} break;
}
serializedObject.ApplyModifiedProperties();
}
private void DrawProperty(string name) {
EditorGUILayout.PropertyField(serializedObject.FindProperty(name));
}
}
ItemType {
Clothes,
Weapon
}
А сущности у нас обычно состоят из многих компонентов... тот же самый игрок, или NPC
Иногда встречаю высказывания, что всю логику хорошо бы делить еще и по MVC/MVP
никогда не ясно насколько качественный код предоставляется в качестве решения моей проблемыЗабей на "качественный код". Писать говнокод ты будешь в любом случае, этого не избежать. Избежать "некачественного кода" при обучении невозможно.
Посоветуйте с чего начать и к чему продвигаться
Как и большинство своих аргументов :)
Дай дураку стеклянный член, он и член разобьет и руки порежет. А с другими форматами, ошибки быть не может? АААА, наверное подсветка синтаксиса есть, ой, так и у меня она тоже есть. Что-то не сходится. Зачем переводчику ридер, если он менять только строку будет? Для чего? Зачем?
Как же ты хочешь меня на чем-то примитивном поддеть. Ну, если не знаешь последовательности, все, дорога в программисты тебе закрыта.
Я так и не понял, понравилось или не понравилось? И в моем формате не пришлось бы гадать. Я бы написал пример, того, как полноценный файл должен выглядеть, если тебе это не очевидно, сожалею.
А ты мне полную строку дай, чего ты просто слово написал.
Так а в чем минусы то? Чем блокнот от экселя отличается? Может у тебя блокнота хорошего не было?