Unity 3d 中对象以波浪形式移动

问题描述 投票:0回答:3

我统一创建了一个对象

GameObject monsterclone = 
      (GameObject)Instantiate(monsterPrefab, floorPosition, Quaternion.identity);

该对象应以波浪形式从 limit1 移动到 limit2。

然后从 limit2 移回到 limit1。

Y 位置以及 x 位置必须以特定方式更改。

Vector3 nPos = mfloorPos + new Vector3(2f, 0f, 0f);
Vector3 oPos = mfloorPos  + new Vector3(-2f, 0f, 0f);   

我该怎么做?

enter image description here

c# unity-game-engine
3个回答
1
投票

如果不知道更具体的信息,我无法准确编写代码,但我认为这个问题已经被问过,任何此链接都会帮助您将对象移动为波

编辑:

我认为向上平移和向下浮动功能将适合您将一个点移动到另一个点 示例:

var floatup;
function Start(){
floatup = false;
}
function Update(){
if(floatup)
floatingup();
else if(!floatup)
floatingdown();
}
function floatingup(){
transform.position.y += 0.3 * Time.deltaTime;
yield WaitForSeconds(1);
floatup = false;
}
function floatingdown(){
transform.position.y -= 0.3 * Time.deltaTime;;
yield WaitForSeconds(1);
floatup = true;
}

示例取自


1
投票
float amplitudeX = -25.0f;
float amplitudeY = 5.0f;
float omegaX = 0.5f;
float omegaY = 4.0f;
float index;

void Update () {
    index += Time.deltaTime;
    float x = amplitudeX*Mathf.Cos (omegaX*index);      
    float y = Mathf.Abs (amplitudeY*Mathf.Sin (omegaY*index));
    if(transform.position.x > 24){
            transform.eulerAngles = new Vector3(270, -90, 0);
    }
    if(transform.position.x < -24){
            transform.eulerAngles = new Vector3(270, 90, 0);
    }   
    transform.localPosition= new Vector3(x,y,20);
}

0
投票

如果这是一个恒定波并且不依赖于速度,我将使用动画来创建 Position.Y 值的文字波曲线(与 Ravindra Shekhawat 解释的原理大致相同。)您可以找到有关动画的更多信息 在这里。

这是一些您可以使用的代码(未经测试)。它是用 C# 编写的,所以我希望将其放入 JavaScript 中不会出现任何问题。

bool monsterMoving = false;

void Update(){
    //check monster moving to start updating position
    if(monsterMoving == true){

        //moving animation controls up and down "wave" movement
        animation.CrossFade('moving'); 

        //Lerp changes position
        Transform.Lerp(transform.Position, oPos, Time.deltaTime); 

        if (transform.Position == oPos) {
            //We are at destination, stop movement
            monsterMoving = false;
        }

    } else {
        // if monster stopped moving, return to idle animation (staying still)
        animation.CrossFade('idle');
    }
}

// function to send a new position to the monster object
void MoveTo(Vector3 newPos){
    oPos = newPos;
    monsterMoving = true;
}
© www.soinside.com 2019 - 2024. All rights reserved.