==
тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).
.equals()
тесты для равенства значений (независимо от того, являются ли они логически «равными»).
Objects.equals () проверяет наличие null
перед вызовом .equals()
, поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).
String.contentEquals () сравнивает содержимое String
с содержимым любого CharSequence
(доступно с Java 1.5).
Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals()
.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Вы почти всегда хотите использовать Objects.equals()
. В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==
.
Из JLS 3.10. 5. Строковые литералы :
Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса
String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя методString.intern
.. Подобные примеры также можно найти в JLS 3.10.5-1 .
Это действительно сложно, так как вам нужно прочитать спецификации для каждого формата (stl / obj / fbx) и понять их, чтобы сделать их самостоятельно. К счастью, уже существует много плагинов, которые могут быть использованы для экспорта единства в stl, obj и fbx.
FBX:
Используется UnityFBXExporter для экспорта Unity mesh в fbx во время выполнения.
public GameObject objMeshToExport;
void Start()
{
string path = Path.Combine(Application.persistentDataPath, "data");
path = Path.Combine(path, "carmodel"+ ".fbx");
//Create Directory if it does not exist
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
FBXExporter.ExportGameObjToFBX(objMeshToExport, path, true, true);
}
OBJ:
Для obj используется ObjExporter
.
public GameObject objMeshToExport;
void Start()
{
string path = Path.Combine(Application.persistentDataPath, "data");
path = Path.Combine(path, "carmodel" + ".obj");
//Create Directory if it does not exist
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
MeshFilter meshFilter = objMeshToExport.GetComponent<MeshFilter>();
ObjExporter.MeshToFile(meshFilter, path);
}
STL:
Вы можете использовать плагин pb_Stl для формата STL.
public GameObject objMeshToExport;
void Start()
{
string path = Path.Combine(Application.persistentDataPath, "data");
path = Path.Combine(path, "carmodel" + ".stl");
Mesh mesh = objMeshToExport.GetComponent<MeshFilter>().mesh;
//Create Directory if it does not exist
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
pb_Stl.WriteFile(path, mesh, FileType.Ascii);
//OR
pb_Stl_Exporter.Export(path, new GameObject[] { objMeshToExport }, FileType.Ascii);
}
Start
. Возможно, вам придется вызватьDirectory.Exists
иDirectory.CreateDirectory
перед сохранением модели, или вы столкнетесь с проблемой этой . Также сделана опечатка путем размещения «.fbx». как расширение всех из них. Теперь это исправлено. См. Редактирование. Вы можете проверить, работает ли сFile.Exists
сохранение, или прочитав файл с помощьюFile.ReadAllBytes
– Programmer 15 October 2017 в 12:11