Как я могу передать аргумент плагину C#, загружаемому посредством блока. CreateInstance?

RigidBodies и Velocities / Physics

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

   Rigidbody.MovePosition(m_Rigidbody.position + movement);

Это вычисляет вектор движения к цели, используя физическую систему, поэтому скорость и движение объекта все еще могут зависеть от сопротивления, углового сопротивления и так далее.

Эта конкретная функция является оберткой вокруг Rigidbody.AddForce Я считаю.

Плюсы:

  • Хорошо, если вам нужны реалистичные физические реакции

Минусы:

  • Немного неудобно использовать, если все, что вы пытаетесь достичь, это перемещение объекта из точки А в точку Б.

    • Иногда неправильная настройка, установленная где-то слишком высоко (например, Масса> 10000000), может привести к действительно странным ошибкам в поведении, которые могут быть довольно трудной задачей, чтобы ограничить и смягчить.

Примечания: Твердые тела при столкновении с другим твердым телом будут отскакивать друг от друга в зависимости от настроек физики.

Они также подвержены влиянию гравитации. По сути, они пытаются имитировать объекты реальной жизни, но иногда бывает трудно приручить объекты и заставить их делать именно то, что вы хотите.

И Rigidbody.AddForce в основном то же, что и выше, за исключением того, что вы сами вычисляете вектор.

Так, например, чтобы получить вектор к цели, вы бы сделали

Vector3 target = target.position - myPosition;

Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

Если вы не планируете использовать какую-либо основную физическую механику в своей игре, я бы предложил двигаться, интерполируя положение объектов. . [+1122]

Поскольку гораздо проще заставить вещи вести себя так, как вы хотите, если, конечно, вы не стремитесь к физическому реализму!

Интерполяция позиции юнитов

Плюсы :

  • Возможно, сначала немного странно понять, но гораздо проще заставить объекты двигаться так, как вы хотите

Минусы:

  • Если вы Требуются реалистичные реакции на объекты, влияющие на то, что вам придется выполнять большую часть работы самостоятельно. Но иногда это предпочтительнее, чем использовать физическую систему, а затем пытаться, как я уже говорил, приручить ее.

Вы будете использовать эту технику, скажем, в игре Pokemon, вы не останавливаетесь в Pokemon и не ждете, пока пепел прекратит скользить или ударит стену и неудержимо подпрыгнет назад.

Эта конкретная функция устанавливает положение объектов, например, телепортацию, но вы также можете использовать это для плавного перемещения персонажа в позицию. Я предлагаю поискать «подростки» для плавной интерполяции между переменными.

    //change the characters x by + 1 every tick, 
Transform.transform.position.x += 1f;

5
задан starblue 25 April 2009 в 13:14
поделиться

5 ответов

Вы не можете. Вместо этого используйте Активатор. CreateInstance как показано в примере ниже (отмечают, что Клиентское пространство имен находится в одном DLL и Хосте в другом. Оба, как должны находить, в том же каталоге для кода работают.)

Однако, если Вы хотите создать действительно сменный интерфейс, я предлагаю, чтобы Вы использовали Инициализировать метод, которые берут данные параметры в Вашем интерфейсе, вместо того, чтобы полагаться на конструкторов. Тем путем можно просто потребовать, чтобы сменный класс реализовал интерфейс, вместо того, чтобы "надеяться", что он принимает принятые параметры в конструкторе.

using System;
using Host;

namespace Client
{
    public class MyClass : IMyInterface
    {
        public int _id;
        public string _name;

        public MyClass(int id,
            string name)
        {
            _id = id;
            _name = name;
        }

        public string GetOutput()
        {
            return String.Format("{0} - {1}", _id, _name);
        }
    }
}


namespace Host
{
    public interface IMyInterface
    {
        string GetOutput();
    }
}


using System;
using System.Reflection;

namespace Host
{
    internal class Program
    {
        private static void Main()
        {
            //These two would be read in some configuration
            const string dllName = "Client.dll";
            const string className = "Client.MyClass";

            try
            {
                Assembly pluginAssembly = Assembly.LoadFrom(dllName);
                Type classType = pluginAssembly.GetType(className);

                var plugin = (IMyInterface) Activator.CreateInstance(classType,
                                                                     42, "Adams");

                if (plugin == null)
                    throw new ApplicationException("Plugin not correctly configured");

                Console.WriteLine(plugin.GetOutput());
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.ToString());
            }
        }
    }
}
12
ответ дан 18 December 2019 в 09:11
поделиться

звонить

public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes)

вместо этого. Документы MSDN

Править: Если Вы собираетесь провалить это, дайте понимание, почему этот подход является неправильным/или не лучший способ.

3
ответ дан 18 December 2019 в 09:11
поделиться
2
ответ дан 18 December 2019 в 09:11
поделиться

Активатор. CreateInstance берет Тип и независимо от того, что Вы хотите передать конструктору Типов.

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

1
ответ дан 18 December 2019 в 09:11
поделиться

Вы также не можете использовать Activator.CreateInstance, который мог бы работать лучше. См. Ниже вопрос о StackOverflow.

Как передать аргументы ctor в Activator.CreateInstance или использовать IL?

0
ответ дан 18 December 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: