首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个gameObject上的统一运动控制器或运动功能

每个gameObject上的统一运动控制器或运动功能
EN

Stack Overflow用户
提问于 2020-11-16 08:43:45
回答 1查看 98关注 0票数 0

所以我试着用不同的单位类型制作一个游戏,每一个都有不同的运动速度。我真的不知道如何面对这个问题:起初,我在每个unitType上都做了一个函数来定义速度,但我不认为这是最理想的方法。现在,我正在考虑创建一个MovementController类。这就是我到目前为止所做的工作:首先,我做了一个通用的Unit -to,保持它很简单,我将只显示运动速度属性-:

代码语言:javascript
复制
 public class GenericUnit : MonoBehaviour
 {
  float movementSpeed;
 
  public float mspeed
     {
         get { return movementSpeed; }
         set { movementSpeed = value; }
     }
 }

之后,我根据单元类型在subClass中定义了所有属性:

代码语言:javascript
复制
public class Archer : MonoBehaviour
 {
        
  GenericUnit archer;
     
  void Start()
  {     
        archer = new GenericUnit();
        archer.mspeed = 3.0f;
         } 
 }

这就是我现在的运动控制器:

代码语言:javascript
复制
 public class Movement_Controller : MonoBehaviour
 {
 
     GenericUnit msUnit;
     public float mspeed;
     public bool movimentTrue;
   
     void Start()
     {
         msunit = new GenericUnit();
 
         mspeed = msUnit.mspeed;
         movimentTrue = true;
         
     }
 
     void Update()
     {
         if (movimentTrue) {
 
             Movement();
 
         }
         
     }
 
     public void Movement(){
 
         Vector3 moviment = new Vector3 (1.0f, 0.0f, 0.0f);
         transform.position += Time.deltaTime * mspeed * moviment;
 
     }      
 }

毕竟,这不管用。你知道这是怎么回事吗?我一直在尝试许多其他的选择,但都没有成功。您认为让这个MovementController脚本或者在Archer类上粘贴移动函数更好吗?正如你所看到的,我是编程新手,所以任何建议都会有很大帮助。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-11-16 09:38:33

您要寻找的是简单的继承。描述基类中需要的特性,并标记它们(和类) 摘要。这迫使您在所有非抽象派生类中重写它。

基类:

代码语言:javascript
复制
public abstract class BaseUnit : MonoBehaviour
{
    protected abstract float movementSpeed { get; } // force every deriving class to provide a movement speed
    [SerializeField] private bool isMoving;

    void Start()
    {
        isMoving = true;
    }

    void Update()
    {
        if (isMoving)
        {
            Movement();
        }

    }

    public void Movement()
    {
        Vector3 direction = new Vector3(1.0f, 0.0f, 0.0f);
        transform.position += Time.deltaTime * movementSpeed * direction;

    }
}

派生类Archer:

代码语言:javascript
复制
public class Archer : BaseUnit
{
    protected override float movementSpeed => 3F;
}

还请注意,您不能使用MonoBehaviours关键字创建new。您必须使用AddComponent<T>创建或使用GetComponent<T>检索它们(见文件)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64854889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档